如何删除引用表的所有FK约束并将其添加回来?

时间:2018-04-17 14:50:02

标签: sql-server foreign-keys truncate

我在SSMS 2016中使用此命令

EXEC sp_fkeys mytable1

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

3 个答案:

答案 0 :(得分:1)

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

禁用外键约束     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;

答案 1 :(得分:0)

不是删除约束并将它们添加回来,这是很多不必要的工作,只需禁用并启用它们。

将代码放在这两行之间:

ALTER TABLE mytable1 NOCHECK CONSTRAINT ALL

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

ALTER TABLE mytable1 CHECK CONSTRAINT ALL

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

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"

答案 2 :(得分:0)

请参阅我的第一条评论。删除而不是截断。禁用约束以便删除更快,因为它们不会检查参照完整性。您需要禁用子级和父级。

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;