我正在向表中添加删除级联。 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)
上答案 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