26

我有60張桌子。我想放10個表格,其中這10個表格是約束(PK,FK)到其他20個表格。在刪除這10個表時,我需要從其他20個表中截斷或刪除數據。最後,我希望禁用所有60個表約束(FK,PK),然後在完成添加/刪除表的工作後啓用所有60個表約束。這可能嗎?如何禁用所有表的約束並啓用它?

當我放下一張桌子時,它要求FK。當我截斷這些FK依賴時,它也顯示相同。我不想混淆所有那些FK,PK。

我想知道更聰明的方法。

回答

46
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?

+0

我試圖禁用和DROP表,但該表沒有得到下降,並說由FK約束引用.., – Out 2013-02-20 05:36:28

+0

@Pink在重新啓用'CONSTRAINT'之前,你已經嘗試過'DROP'語句嗎? – 2013-02-20 05:48:12

+0

我有禁用約束和DROP表,當禁用它必須下降沒有錯誤,但它再次顯示「無法刪除對象'DropTable',因爲它由FOREIGN KEY約束引用」。 – Out 2013-02-20 05:54:28

5

嘗試使用此命令

ALTER TABLE table_Name NOCHECK CONSTRAINT all 

禁用喲所有約束ur表格,併爲所有10個表格執行此操作,但在此之前請檢查您是否未在表格上放置任何Delete_Cascade,因爲顯示的錯誤可能是由於sub_tables依賴關係造成的。如果它沒有工作,試着通過這個命令禁用特定的約束,它可能有兩個或三個額外的依賴關係。

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName 
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; 
+1

只需將「nocheck約束全部」更改爲「全部檢查約束」即可爲所有表啓用約束。 – Alexey 2013-02-20 05:51:43

+0

當我執行這些查詢它是成功的,但仍然當我試圖刪除表,它不能因爲FK約束而下降。我的目標是刪除沒有FK錯誤的表格,只需禁用FK並刪除表格 – Out 2013-02-20 05:59:53

+0

我將「where schemaTables.TABLE_TYPE ='BASE TABLE'」添加到查詢中以獲取表格並且它對我有用。 – jboo 2015-02-19 18:44:00

21

要禁用,你可以應用此:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

要啓用:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"