当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?相关的知识,希望对你有一定的参考价值。
我运行一个删除记录的存储过程,然后从源系统重新填充它们。 SP的删除部分根据表的层次结构进行构造,从引用表(CHILD_TABLE
)中删除之前从引用表中删除(让我们称之为PARENT_TABLE
)。从PARENT_TABLE
删除时,我收到“与REFERENCE约束冲突的DELETE语句...”错误。
delete语句中有一个where子句,当我运行带有相同where子句的select语句时,我返回了11条记录。所以我们试图删除11条记录。
CHILD_TABLE
引用PARENT_TABLE
和含有PARENT_TABLE.PRIMARY_KEY
的FK列。但是当我针对CHILD_TABLE
运行select语句时,使用以下任一方法,我得到0行返回:
- 使用
PARENT_TABLE.PRIMARY_KEY
将select语句中的IN
值复制并粘贴到where子句中 - 复制并粘贴上面的select语句,并使用
IN
对FK / PK放入where子句 - 复制并粘贴上面的select语句并使用
EXISTS WHERE
等放入where子句。
所以在我看来,像SQL Server认为CHILD_TABLE
中有数据时确实没有。
这个问题看起来像"The DELETE statement conflicted with the REFERENCE constraint" while there is no data in referenced table的副本,但答案是(释义)“参考表中实际上有数据”。但是,就我而言,引用的表中确实没有数据。不完全是。
我想知道是否有一个过时的索引显示参考约束,那么当真的没有时会有数据?
任何帮助/指针赞赏。
我不知道为什么这个问题被投票了很多次,当问题没有解释现有的模式定义或删除脚本时。
Trigger
,Cascade delete
已在上面讨论过。或者in-consistence transaction
或lock
也在上面讨论。
我创建了一个情况,作为一个新的开发人员,我不知道完整的数据库。
CREATE table parent(col int not null primary key)
CREATE table child(col int not null primary key)
CREATE table child1(col2 int not null primary key,col int not null foreign key references parent(col))
--insert into parent VALUES(1),(2),(3)
--insert into child VALUES(1),(2),(3)
--insert into child1 VALUES(1,1),(2,2),(3,3)
--select * from parent
begin try
begin transaction
delete from child where col=2
--select * from child where col=2
delete from parent where col=2
COMMIT
end TRY
begin CATCH
if(@@trancount>0)
ROLLBACK TRANSACTION;
THROW;
END CATCH
--select * from child
drop table child1
drop table child
drop table parent
在这里我知道另一个子表child1
.so当我尝试删除上面的父亲我得到类似的错误。
所以我将运行这个脚本,
SELECT OBJECT_NAME(constraint_object_id) AS ConstraintName, OBJECT_NAME(parent_object_id) AS ReferencingObject,
OBJECT_NAME(referenced_object_id) AS ReferencedObject, *
FROM sys.foreign_key_columns
where OBJECT_NAME(referenced_object_id)='parent'
这将揭示我的第二个儿童表child1
以上是关于当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中运行 DELETE 语句之前确定要在相关/其他表中删除的记录