32

我有 60 张桌子。我想删除 10 个表,其中这 10 个表是约束(PK,FK)到其他 20 个表。在删除这 10 个表时,我需要从其他 20 个表中截断或删除数据。最后,我想禁用所有 60 个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有 60 个表约束。这可能吗?

当我放下一张桌子时,它要求 FK。当我截断那些 FK 依赖项时,它仍然显示相同。我不想惹所有那些FK,PK。

我想知道更聪明的方法。

4

4 回答 4

53
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 获取外键引用?

于 2013-02-20T05:27:49.817 回答
30

要禁用,您可以应用此:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

启用:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
于 2013-11-27T17:29:30.043 回答
8
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;
于 2013-02-20T05:47:59.913 回答
5

尝试使用此命令

ALTER TABLE table_Name NOCHECK CONSTRAINT all

禁用表的所有约束,并为所有 10 个表执行此操作,但在此之前检查您是否没有在表上放置任何 Delete_Cascade,因为显示的错误也可能是由于 sub_tables 依赖关系。如果它不起作用,请尝试通过此命令禁用特定约束,它可能是两个或三个额外的依赖项。

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName
于 2013-02-20T05:45:25.407 回答