更改列的数据类型/约束

时间:2018-03-13 16:46:01

标签: sql-server

我有一个包含列people的现有列pid。我想改变pid

  • int - > 5个字符的长字符串

  • unique - >在pidcompany_id(外键)

  • 中唯一

我目前没有在我的mssql数据库中使用pid,所以我可以删除该列。我的理解是,我必须将我的任务分解为三个步骤:

  1. 删除列
  2. 添加列
  3. 为列添加唯一性
  4. 我的mssql语句是否会像:

    ALTER TABLE people DROP COLUMN pid;
    ALTER TABLE people ADD pid VARCHAR(5);
    ALTER TABLE people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
    

    我已经执行了上面的mssql语句,但是我的pid中没有看到people列。我没有注意到任何错误被抛出,我想在深入探讨之前验证我的陈述是否正确。

1 个答案:

答案 0 :(得分:1)

我想问题是批处理失败了。可能的原因是您需要在创建pid之前为CONSTRAINT设置值。如果您的表格中有任何数据且company_id不是唯一的,那么您将拥有重复的值。因此,作为一个简单的例子,以下内容将起作用:

CREATE TABLE #people (pid int, company_id int)
GO

SELECT *
FROM #people;
GO

ALTER TABLE #people DROP COLUMN pid;
ALTER TABLE #people ADD pid VARCHAR(5);
ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
GO

SELECT *
FROM #people;
GO

DROP TABLE #people;

但是,如果我先在表格中放入一些数据,批处理将失败:

CREATE TABLE #people (pid int, company_id int)
GO

INSERT INTO #people (company_id)
VALUES (1),(1),(2);
GO
SELECT *
FROM #people;
GO

ALTER TABLE #people DROP COLUMN pid;
ALTER TABLE #people ADD pid VARCHAR(5);
ALTER TABLE #people ADD CONSTRAINT unique_pid UNIQUE (pid, company_id);
GO

SELECT *
FROM #people;
GO

DROP TABLE #people;

在这种情况下,我实际上仍然有列pid,但CONSTRAINT失败了。根据您的交易地点,可能是DROP已提交,但ADD已使用ADD CONSTRAINT回滚。

要解决此问题,您需要先使用相关数据填充(新)列pid,然后添加CONSTRAINT

相关问题