本文转自: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'。
语句已终止。

[转] SQL Server 批量 停用/启用 外键约束的更多相关文章

  1. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  2. SQLServer禁用、启用外键约束

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ---启用or禁用指定表所有外键约束  alter table PUB_STRU  NOCHECK constrai ...

  3. 通过sql命令建表 和 主外键约束以及其他约束

    create table命令 create table dept ( dept_id int primary key, dept_name ) not null, dept_address ) ) c ...

  4. sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务

    外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...

  5. mysql关闭/启用外键约束

    1.有时为了导入数据方便,需要临时关闭外键约束mysql>SET FOREIGN_KEY_CHECKS=0; 2.打开外键约束mysql>SET FOREIGN_KEY_CHECKS=1; ...

  6. ms sql 带自增列 带外键约束 数据导入导出

    1,生成建表脚本 选中要导的表,点右键-编写表脚本为-create到  ,生成建表脚本 2,建表(在新库),但不建外键关系 不要选中生成外键的那部分代码,只选择建表的代码 3,导数据,用SQL STU ...

  7. SQL批量删除用户表(先删除所有外键约束,再删除所有表)

    --批量删除用户表 --1.删除外键约束DECLARE c1 cursor for     select 'alter table ['+ object_name(parent_obj) + '] d ...

  8. Oracle 外键约束

    本文讨论一下Oracle中的外键约束问题,以及和DB2中的小不同. 首先创建测试环境. -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, valu ...

  9. Constraint6:更新外键约束(Foreign Key Constraint)的引用列

    在SQL Server中,表之间存在引用关系,引用关系通过创建外键约束(Foreign Key Constraint)实现.如果一个Table中的column被其他Table引用,那么该表是参考表,或 ...

随机推荐

  1. django的事务

    在某些时候,你可能会在视图修改两张数据表.并且想让他们同时成功或者同时失败.这就是事务的原子性(atomicity).在django中应该怎么做呢? 详细可以参考官方文档:https://yiyibo ...

  2. hive学习(三) hive的分区

    1.Hive 分区partition 必须在表定义时指定对应的partition字段 a.单分区建表语句: create table day_table (id int, content string ...

  3. 解决Django在mariadb创建的表插入中文乱码的问题

    1.确保你的mariadb数据库的character_set_connection.character_set_database.character_set_server的编码均为utf8 Maria ...

  4. Ubuntu 虚拟机增强包下载

    https://www.virtualbox.org/wiki/Download_Old_Builds_5_1 Extension Pack All Platforms 安装方法详情:https:// ...

  5. python之md5模块

    python的md5模块使用非常简单,包括以下几个函数: md5.new([arg]) 返回一个md5对象,如果给出参数,则相当于调用了update(arg) md5.updte(arg) 用stri ...

  6. NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  7. AtCoder Regular Contest 103 Problem D Robot Arms (构造)

    题目链接  Problem D 给定$n$个坐标,然后让你构造一个长度为$m$的序列, 然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向, 每次从原点出发按照这个序列方向,每 ...

  8. 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句

    在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...

  9. JavaScript函数的防抖和节流

    防抖 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 思路: 每次触发事件时都取消之前的延时调用方法 function debounce(fn) { let tim ...

  10. 【Java多线程】线程池学习

    Java线程池学习 众所周知,Java不仅提供了线程,也提供了线程池库给我们使用,那么今天来学学线程池的具体使用以及线程池基本实现原理分析. ThreadPoolExecutor ThreadPool ...