sqlserver怎么删除有外键关联的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver怎么删除有外键关联的数据?相关的知识,希望对你有一定的参考价值。

--使用SYSREFERENCES
--删除外键
set xact_abort on
begin tran
DECLARE @SQL VARCHAR(99)
DECLARE CUR_FK CURSOR LOCAL FOR
SELECT \'alter table [\'+ OBJECT_NAME(FKEYID) + \'] drop constraint \' + OBJECT_NAME(CONSTID) FROM SYSREFERENCES
--删除所有外键
OPEN CUR_FK
FETCH CUR_FK INTO @SQL
WHILE @@FETCH_STATUS =0
BEGIN
EXEC(@SQL)
FETCH CUR_FK INTO @SQL
END
CLOSE CUR_FK
DEALLOCATE CUR_FK
-- 删除所有表
DECLARE CUR_TAB CURSOR LOCAL FOR
SELECT \'DROP TABLE \'+ NAME FROM SYSOBJECTS WHERE XTYPE=\'U\' -- AND NAME LIKE \'xx%\'
OPEN CUR_TAB
FETCH CUR_TAB INTO @SQL
WHILE @@FETCH_STATUS =0
BEGIN
EXEC(@SQL)
FETCH CUR_TAB INTO @SQL
END
CLOSE CUR_TAB
DEALLOCATE CUR_TAB
commit tran

--使用sys.foreign_keys
--disable and enable 外键
这里解释下 CHECK | NOCHECK CONSTRAINT

Specifies that constraint_name is enabled or disabled. This option can only be used with FOREIGN KEY and CHECK constraints. When NOCHECK is specified, the constraint is disabled and future inserts or updates to the column are not validated against the constraint conditions. DEFAULT, PRIMARY KEY, and UNIQUE constraints cannot be disabled.
上面的解释是,NOCHECK对应于disable, CHECK则对应于enable

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)
具体会有多少条记录,取决于你的数据库里面,有多少个外键了。

然后复制结果, 粘贴出来执行. 就停用 外键约束了.

再删除数据

数据删除好了, 再启用外键约束

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)

和前面的一样, 把查询出来的结果, 复制一下, 然后粘贴出来去执行.

--使用sys.foreign_key_columns

--查出外键
select name
from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id
where f.parent_object_id=object_id(\'表名\')
--删除外键
alter table 表名 drop constraint 外简名
参考技术A ALTER TABLE table_name NOCHECK CONSTRAINT FK_name
delete from table_name
删除数据并进行相关操作后,可以:
ALTER TABLE table_name CHECK CONSTRAINT FK_name
不过这样操作后不敢保证数据的完整性
参考技术B 几个选择,

一、先把外键关联的数据删掉,然后再删除主表里的数据。
二、启用sqlserver的级联删除,删除主表数据时候,会附带把外建表里的数据删除掉。

三、把外键关系去掉
参考技术C 外键关联 是为了数据完整性,
要删的话,先删子,后删父。
参考技术D foreign key(字段名) references 主表名(字段名)
on delete cascade

以上是关于sqlserver怎么删除有外键关联的数据?的主要内容,如果未能解决你的问题,请参考以下文章

sql 关联查询外键为空的情况

有外键约束的时候我们应该怎么样写入数据呢

有外键约束的表,删除父表的数据,会出现哪几种情况?

sql查询未被外键关联的数据

SQL 怎样删除有外键约束的表

powerdesigner12的外键怎么设置和删除?