SQL SERVER启动禁用外键约束

版权声明: https://blog.csdn.net/ClearLoveQ/article/details/83823867

第一种方法:

-- =====================================================
-- 删除数据库中的所有数据(通过禁用约束)
-- 不好的地方在于如果本身有已经禁用的约束,执行这个后会开启它

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

猜你喜欢

转载自blog.csdn.net/ClearLoveQ/article/details/83823867
今日推荐