SQL SERVER啟動禁用外來鍵約束
阿新 • • 發佈:2018-11-12
第一種方法:
-- ===================================================== -- 刪除資料庫中的所有資料(通過禁用約束) -- 不好的地方在於如果本身有已經禁用的約束,執行這個後會開啟它 -- 鄒建 2005.09(引用請保留此資訊) -- ===================================================== -- 禁用所有約束 EXEC sp_msforeachtable @command1=N'ALTER TABLE ? NOCHECK CONSTRAINT ALL' -- 刪除無外來鍵約束的表中的資料 EXEC sp_msforeachtable @command1=N'TRUNCATE TABLE ?', @whereand=N'AND NOT EXISTS( SELECT rkeyid FROM dbo.sysforeignkeys WHERE rkeyid=O.id) AND EXISTS( SELECT rows FROM dbo.sysindexes WHERE id=O.id AND rows>0 AND indid<2)' -- 刪除有外來鍵約束的表中的資料 EXEC sp_msforeachtable @command1=N'DELETE ?', @whereand=N'AND EXISTS( SELECT rows FROM dbo.sysindexes WHERE id=O.id AND rows>0 AND indid<2)' -- 啟用所有約束 EXEC sp_msforeachtable @command1=N'ALTER TABLE ? CHECK CONSTRAINT ALL'
第二種方式:
---啟用or禁用指定表所有外來鍵約束 alter table PUB_STRU NOCHECK constraint all; alter table PUB_STRU CHECK constraint all; ---生成啟用or禁用指定表外來鍵約束的sql select 'ALTER TABLE ' + b.name + ' NOCHECK CONSTRAINT ' + a.name +';' from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id and b.name='表名'; select 'ALTER TABLE ' + b.name + ' CHECK CONSTRAINT ' + a.name +';' from sysobjects a ,sysobjects b where a.xtype ='f' and a.parent_obj = b.id and b.name='表名'; --生成的sql如下 ALTER TABLE PUB_STRU NOCHECK CONSTRAINT PUBSTRU_FK1; ALTER TABLE PUB_STRU NOCHECK CONSTRAINT PUBSTRU_FK2; ALTER TABLE PUB_STRU CHECK CONSTRAINT PUBSTRU_FK1; ALTER TABLE PUB_STRU CHECK CONSTRAINT PUBSTRU_FK2; --檢視約束狀態(查詢字典表 sys.foreign_keys,該字典表開始出現於sqlserver2005及以上版本): select name , is_disabled from sys.foreign_keys order by name; --其中:name : 外來鍵約束名稱 is_disabled : 是否已禁用 例子: --刪除外來鍵 alter table AdItem drop constraint AdOrder_AdItem_FK1 --增加外來鍵 alter table AdItem add constraint AdOrder_AdItem_FK1 foreign key (AI_nOrderNo) references AdOrder(AO_nOrderNo) --單個表的一個外來鍵 alter table Student nocheck constraint FK__Student__SchoolN__4222D4EF alter table Student check constraint FK__Student__SchoolN__4222D4EF --單個表的所有外來鍵 alter table Student nocheck constraint all alter table Student check constraint all --某個資料庫的所有表 EXEC sp_MSforeachtable @command1='alter table ? NOCHECK constraint all; EXEC sp_MSforeachtable @command1='alter table ? CHECK constraint all;