本文转自: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. git学习资源合集

    git官网 Pro git 电子书,这里还有中文版,这也是官方推荐的. 再加一个廖雪峰的简明git教程.

  2. gulp在webstorm里运行,告别cmd控制台!

    使用webstorm运行gulp程序,不再用一直开着cmd了!鬼知道自己会不会不小心关闭了cmd呢.看截图操作吧! 如果你的gulp设置了default任务,那么直接点击“运行‘default‘’就行 ...

  3. CentOS 7.4 如何安装 MariaDB 10.3.9 Stable 数据库

    CentOS 7.4 如何安装 MariaDB 10.3.9 Stable 数据库 一.CentOS 7.4上卸载 Mariadb 数据库 1.查询所安装的MariaDB组件 [libin@VM_0_ ...

  4. Interllij IDEA常用快捷键

    [常规] Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关 ...

  5. cocos-js Http方式网络请求

    (转http://blog.csdn.net/sinat_28338727/article/details/52804167) 网络结构 网络结构是网络的构建方式,目前流行的有客户端服务器结构网络和点 ...

  6. .net mvc禁用浏览器缓存

    我正在寻找方法来禁用 整个 ASP.Net MVC 网站 的浏览器缓存 我发现以下方法, Response.Cache.SetCacheability(System.Web.HttpCacheabil ...

  7. Codeforces 1099 A. Snowball-暴力(Codeforces Round #530 (Div. 2))

    A. Snowball time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. thinkphp下实现ajax无刷新分页

    1.前言 作为一名php程序员,我们开发网站主要就是为了客户从客户端进行体验,在这里,thinkphp框架自带的分页类是每次翻页都要刷新一下整个页面,这种翻页的用户体验显然是不太理想的,我们希望每次翻 ...

  9. NOI2015 D1T2 软件包管理器

    题目传送门; 这个貌似是我这个蒟蒻做的第一道NOI系列的题了吧...这题的算法是树链剖分,其实基本上就是很常见的树剖+线段树,题目既然是要求每次安装或卸载改变的软件包的数目,那么就在每次操作前记录下线 ...

  10. plsql分支,循环,异常

    pl/sql 分支,循环和异常分支:    DECLARE        BEGIN        END; 循环:loop,while,for    1.LOOP        EXIT WHEN ...