如何删除所有引用 table 的 FK 约束并将它们添加回来?

How to drop all FK contraints referencing a table and add them back?

我在 SSMS 2016 中使用这个命令

EXEC sp_fkeys mytable1

并且我有 30 多个 FK 约束引用此 table 中的列。我如何一次性删除所有约束,做一些截断工作(需要将 table 从一台服务器复制到另一台服务器)并将它们全部添加回来?

与其删除约束并重新添加它们,这是很多不必要的工作,不如简单地禁用和启用它们。

将您的代码放在这两行之间:

ALTER TABLE mytable1 NOCHECK CONSTRAINT ALL

-- put your code here. Example: DELETE FROM mytable1

ALTER TABLE mytable1 CHECK CONSTRAINT ALL

根据您 table 的关系,您可能需要禁用对其他 table 引用您的 table 的约束。例如,如果您需要禁用对两个 table 的约束:

ALTER TABLE mytable1 NOCHECK CONSTRAINT ALL
ALTER TABLE mytable2 NOCHECK CONSTRAINT ALL

-- put your code here. Example: DELETE FROM mytable1

ALTER TABLE mytable2 CHECK CONSTRAINT ALL
ALTER TABLE mytable1 CHECK CONSTRAINT ALL

如果你想禁用和启用数据库中的所有约束(不推荐,除非你知道你在做什么),你可以使用:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- put your code here. Example: DELETE FROM mytable1

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

看到我的第一条评论。删除而不是截断。禁用约束,以便删除速度更快,因为它们不检查参照完整性。您需要在 child 和 parent 上禁用。

ALTER TABLE parent NOCHECK CONSTRAINT ALL;
ALTER TABLE child NOCHECK CONSTRAINT ALL;
delete parent where pk = 1
ALTER TABLE parent CHECK CONSTRAINT ALL
ALTER TABLE child CHECK CONSTRAINT ALL;

我找到了答案,我需要先禁用所有外键约束,然后像狗仔队所说的那样删除数据,然后重新启用它们。

脚本如下:

禁用外键约束。

DECLARE @sql NVARCHAR(MAX) = N'';   

;WITH x AS 
(
  SELECT DISTINCT obj = 
      QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' 
    + QUOTENAME(OBJECT_NAME(parent_object_id)) 
  FROM sys.foreign_keys
)
SELECT @sql += N'ALTER TABLE ' + obj + ' NOCHECK CONSTRAINT ALL;
' FROM x;

EXEC sp_executesql @sql;

启用它们

DECLARE @sql NVARCHAR(MAX) = N'';

;WITH x AS 
(
  SELECT DISTINCT obj = 
      QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' 
    + QUOTENAME(OBJECT_NAME(parent_object_id)) 
  FROM sys.foreign_keys
)
SELECT @sql += N'ALTER TABLE ' + obj + ' WITH CHECK CHECK CONSTRAINT ALL;
' FROM x;

EXEC sp_executesql @sql;