1. 程式人生 > >SQL SERVER啟動禁用外來鍵約束

SQL SERVER啟動禁用外來鍵約束

第一種方法:

-- =====================================================
-- 刪除資料庫中的所有資料(通過禁用約束)
-- 不好的地方在於如果本身有已經禁用的約束,執行這個後會開啟它

-- 鄒建 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;