我有 60 张桌子。我想删除 10 个表,其中这 10 个表是约束(PK,FK)到其他 20 个表。在删除这 10 个表时,我需要从其他 20 个表中截断或删除数据。最后,我想禁用所有 60 个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有 60 个表约束。这可能吗?
当我放下一张桌子时,它要求 FK。当我截断那些 FK 依赖项时,它仍然显示相同。我不想惹所有那些FK,PK。
我想知道更聪明的方法。
我有 60 张桌子。我想删除 10 个表,其中这 10 个表是约束(PK,FK)到其他 20 个表。在删除这 10 个表时,我需要从其他 20 个表中截断或删除数据。最后,我想禁用所有 60 个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有 60 个表约束。这可能吗?
当我放下一张桌子时,它要求 FK。当我截断那些 FK 依赖项时,它仍然显示相同。我不想惹所有那些FK,PK。
我想知道更聪明的方法。
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO
您可能还想这样做:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
GO
之后启用它们
EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
GO
-- SQL enable all constraints - enable all constraints sql server
-- sp_MSforeachtable is an undocumented system stored procedure
EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"
GO
编辑:
如果禁用约束还不够,你将不得不放弃约束。
如果您要删除并重新创建表,则必须在之后重新创建外键约束。
如果您只需要删除约束,您可能会发现这很有用:
SQL DROP TABLE foreign key constraint
如果您需要编写脚本来删除和创建约束,您可能会发现我的帖子更有用:
SQL Server:如何从 information_schema 获取外键引用?
要禁用,您可以应用此:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
启用:
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
declare @tname varchar(128), @tschema varchar(128);
declare tables cursor for
select TABLE_SCHEMA, TABLE_NAME
from INFORMATION_SCHEMA.TABLES;
open tables;
fetch next from tables
into @tschema, @tname;
while @@FETCH_STATUS = 0
begin
execute ('alter table [' + @tschema + '].[' + @tname + '] nocheck constraint all');
fetch next from tables
into @tschema, @tname;
end;
close tables;
deallocate tables;
尝试使用此命令
ALTER TABLE table_Name NOCHECK CONSTRAINT all
禁用表的所有约束,并为所有 10 个表执行此操作,但在此之前检查您是否没有在表上放置任何 Delete_Cascade,因为显示的错误也可能是由于 sub_tables 依赖关系。如果它不起作用,请尝试通过此命令禁用特定约束,它可能是两个或三个额外的依赖项。
ALTER TABLE tableName NOCHECK CONSTRAINT constraintName