sql在外键存在的情况下删除表
2013-06-28 06:17
211 查看
SQL Server 批量 停用/启用 外键约束
今天百度知道上面,看到这样一个要求:现在有一个库,有很多张表
想要删除一张表的记录的时候,由于外键关联太多,
所以,没法删除相应的记录,
谁能帮忙写个存储过程,就是先删除所有表的主,外键,
然后进行删除表记录,然后再恢复之前所有的主外键.
一眼看上去,需要批量删除所有外键,并不困难。
但是要求批量所有外键之后,
一切处理完毕后,还要把外键重建回来。
这个有点复杂了。
心想,如果删除之后,还要重建的。
那还不如一开始就不删除,只是暂时 “不可用”。
等一系列的操作执行完毕后,
再把这些前面暂时 “不可用” 的外键 “恢复使用”
首先生成 停用 外键的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— 存在检测、建库、 建表、约束、外键、级联删除
- SQL语句删除和添加外键、主键
- SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
- pl/sql开发关于表存在则删除,字符串数组的定义和基本的plsql语法
- MS SQL SERVER中删除存在的临时表
- 用Sql添加删除字段,判断字段是否存在的方法
- 在已存在的字段上添加和删除默认值,sql:
- sql语句添加删除外键及其约束
- sql语句添加删除外键
- sql 添加 删除 判断字段是否存在
- 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?
- oracle(PL/SQL)表操作:创建表时检查数据库是否存在该表,若存在删除再创建
- sql语句添加删除外键
- SQL删除数据因外键关联导致花费时间太长----(外键列上增加索引解决此问题)
- SQL语句删除和添加外键、主键的方法
- sql语句添加删除外键
- 存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?
- *用Sql添加删除字段,判断字段是否存在的方法
- SQL 语句创建表 添加、删除、修改字段 表是否存在 是否存在数据
- T-SQL创建前删除已存在存储过程