添加约束与自身冲突,即使它尚不存在

时间:2014-12-18 19:00:59

标签: sql-server

我正在向表中添加删除级联。 Clone表有一列DeviceID,它是Device表的DeviceID列的外键。因此,SQL脚本删除了原始的FK约束,并尝试添加新的约束:

IF EXISTS
(
    SELECT *
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_NAME = 'FK_Clone_Device'
)
BEGIN
    ALTER TABLE Clone
    DROP CONSTRAINT FK_Clone_Device
END

IF NOT EXISTS
(
    SELECT *
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_NAME = 'FK_Clone_Device_Cascade'
)
BEGIN
    ALTER TABLE Clone
    ADD CONSTRAINT FK_Clone_Device_Cascade
    FOREIGN KEY (DeviceID) REFERENCES Device(DeviceID) ON DELETE CASCADE
END

当我运行此脚本时,出现以下错误:

 The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Clone_Device_Cascade". The conflict occurred in database "DevelopmentDB", table "dbo.Device", column 'DeviceID'.

也许我误解了错误信息,但听起来它与自己有冲突。我很困惑,它发生在Device牌桌上。

Clone上的DeviceID表格中有一个索引。那会有关系吗?

这是在SQL SERVER R2(Azure)

1 个答案:

答案 0 :(得分:9)

听起来你表中目前的数据会违反你想要创建的FK。测试此方法的一种方法是在ALTER TABLE语句中添加“WITH(NOCHECK)”,看看它是否允许您创建约束。

如果允许您使用NOCHECK创建约束,则可以保留该方式,约束将仅用于测试将来的插入/更新,或者您可以调查数据以修复FK违规。

所以你的例子是:

ALTER TABLE Clone WITH NOCHECK
ADD CONSTRAINT FK_Clone_Device_Cascade
FOREIGN KEY (DeviceID) REFERENCES Device(DeviceID) ON DELETE CASCADE