我有60张桌子。我想删除10个表,其中这10个表是约束(PK,FK)到其他20个表。删除这10个表时,我需要截断或删除其他20个表中的数据。最后,我想禁用所有60个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有60个表约束。这可能吗?
当我放桌子时,它要求FK。当我截断那些FK依赖项时,它仍然显示相同。我不想搞砸那些FK,PK。
我想知道更聪明的方法。
答案 0 :(得分:48)
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: Howto get foreign key reference from information_schema?
答案 1 :(得分:23)
要禁用,您可以应用此功能:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
启用:
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
答案 2 :(得分:7)
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;
答案 3 :(得分:5)
尝试使用此命令
ALTER TABLE table_Name NOCHECK CONSTRAINT all
禁用表的所有约束,并对所有10个表执行此操作,但在此之前检查是否未在表上放置任何Delete_Cascade,因为显示的错误可能也是因为sub_tables依赖性。如果它不起作用尝试通过此命令禁用特定约束,它可能有两个或三个额外的依赖项。
ALTER TABLE tableName NOCHECK CONSTRAINT constraintName