如何删除所有引用 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;
我在 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;