SQLServer外键检查已禁用但仍无法删除表

时间:2017-04-28 13:58:49

标签: sql-server database

我有一个SQLServer数据库,我想从中删除一个表。该表具有FK约束,但在这种情况下无关紧要,因为当我重新填充表时,FK将被正确替换。

我已完成EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all",它会发出一条消息:sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINTS all" succeded,但是当我尝试删除我的表时,我收到以下SQL错误:SQL Error: Could not drop object 'myTable' because ti is referenced by a FOREIGN KEY constraint

该命令是否应该影响我的整个数据库并允许我在没有问题的情况下删除该表?我也尝试过EXEC sp_msforeachtable "ALTER TABLE myTable NOCHECK CONSTRAINT all",导致同样的错误。

2 个答案:

答案 0 :(得分:3)

  

该命令是否应该影响我的整个数据库并允许我   放弃桌面没有问题?

没有。 NOCHECK状态是什么并不重要;如果存在引用目标表的FK约束,则不能删除该目标表。

删除表的唯一方法是首先删除引用它的FK约束。

答案 1 :(得分:2)

NOCheck禁用约束,因此不会强制执行。这将允许您删除数据而不违反约束。

删除表会使约束定义无效。您不能拥有引用不存在的表的约束。在约束存在的情况下,您将无法从表中删除引用的列。

如果要重新填充表,只需删除表数据并重新加载即可。如果您绝对必须放弃并重新创建表格,则需要包含drop& amp;也为你的外键约束创建语句。

请注意,如果禁用约束,则需要启用WITH CHECK CHECK(是两次)。第一个检查为新数据打开约束,第二个检查告诉SQL验证现有数据。如果只执行一项,将检查新数据,但现有数据将不会是“TRUSTED”,这会影响SQL在查询中利用FK引用的方式。