本文轉自:http://hi.baidu.com/wangzhiqing999/item/ca699308de4f1ff9a1103429
今天百度知道上面,看到這樣一個要求: 現在有一個庫,有很多張表 想要刪除一張表的記錄的時候,由於外鍵關聯太多, 所以,沒法刪除相應的記錄, 誰能幫忙寫個存儲過程,就是先刪除所有表的主,外鍵, 然后進行刪除表記錄,然后再恢復之前所有的主外鍵. 一眼看上去,需要批量刪除所有外鍵,並不困難。 但是要求批量所有外鍵之后, 一切處理完畢后,還要把外鍵重建回來。 這個有點復雜了。 心想,如果刪除之后,還要重建的。 那還不如一開始就不刪除,只是暫時 “不可用”。 等一系列的操作執行完畢后, 再把這些前面暫時 “不可用” 的外鍵 “恢復使用” 首先生成 停用 外鍵的SQL語句 select 'ALTER TABLE '+o.name+' NOCHECK CONSTRAINT '+fk.name+';' AS Command from sys.foreign_keys fk JOIN sys.all_objects o ON (fk.parent_object_id=o.object_id) 具體會有多少條記錄,取決於你的數據庫里面,有多少個外鍵了。 在我的測試數據庫里面,只有一個外鍵。 所以我的執行結果為: ALTER TABLE test_sub NOCHECK CONSTRAINT main_id_cons; 把所有的執行結果,都去執行一遍, 就可以將所有的 外鍵約束停用。 下面是執行的測試: 1> delete from test_main 2> go 消息 547,級別 16,狀態 1,服務器 GMJ-PC\SQLEXPRESS,第 1 行 DELETE 語句與 REFERENCE 約束"main_id_cons"沖突。該沖突發生於數據庫"Test",表"dbo .test_sub", column 'main_id'。 語句已終止。 1>ALTER TABLE test_sub NOCHECK CONSTRAINT main_id_cons; 2> go 1> delete from test_main 2> go (2 行受影響) 1> delete from test_sub 2> go (2 行受影響) 數據清理完畢后,恢復外鍵 select 'ALTER TABLE '+o.name+' CHECK CONSTRAINT '+fk.name+';' AS Command from sys.foreign_keys fk JOIN sys.all_objects o ON (fk.parent_object_id=o.object_id) 我的執行結果為: ALTER TABLE test_sub CHECK CONSTRAINT main_id_cons; 測試外鍵約束是否啟用了 1> ALTER TABLE test_sub CHECK CONSTRAINT main_id_cons; 2> go 1> INSERT INTO test_sub VALUES (1, 2 , 'A'); 2> go 消息 547,級別 16,狀態 1,服務器 GMJ-PC\SQLEXPRESS,第 1 行 INSERT 語句與 FOREIGN KEY 約束"main_id_cons"沖突。該沖突發生於數據庫"Test",表"d bo.test_main", column 'id'。 語句已終止。