我有一个包含列people
的现有列pid
。我想改变pid
:
int - > 5个字符的长字符串
unique - >在pid
和company_id
(外键)
我目前没有在我的mssql数据库中使用pid
,所以我可以删除该列。我的理解是,我必须将我的任务分解为三个步骤:
我的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
列。我没有注意到任何错误被抛出,我想在深入探讨之前验证我的陈述是否正确。
答案 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
。