当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?

问题描述 投票:5回答:1

我运行一个删除记录的存储过程,然后从源系统重新填充它们。 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行返回:

  1. 使用PARENT_TABLE.PRIMARY_KEY将select语句中的IN值复制并粘贴到where子句中
  2. 复制并粘贴上面的select语句,并使用IN对FK / PK放入where子句
  3. 复制并粘贴上面的select语句并使用EXISTS WHERE等放入where子句。

所以在我看来,像SQL Server认为CHILD_TABLE中有数据时确实没有。

这个问题看起来像"The DELETE statement conflicted with the REFERENCE constraint" while there is no data in referenced table的副本,但答案是(释义)“参考表中实际上有数据”。但是,就我而言,引用的表中确实没有数据。不完全是。

我想知道是否有一个过时的索引显示参考约束,那么当真的没有时会有数据?

任何帮助/指针赞赏。

sql-server sql-server-2012
1个回答
0
投票

我不知道为什么这个问题被投票了很多次,当问题没有解释现有的模式定义或删除脚本时。

TriggerCascade delete已在上面讨论过。或者in-consistence transactionlock也在上面讨论。

我创建了一个情况,作为一个新的开发人员,我不知道完整的数据库。

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

© www.soinside.com 2019 - 2024. All rights reserved.