我在SSMS 2016中使用此命令
EXEC sp_fkeys mytable1
我有超过30个FK约束引用此表中的列。如何一次性删除所有约束,执行一些截断工作(需要将表从一个服务器复制到另一个服务器)并将它们全部添加回去?
答案 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;