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

Aph*_*ppe 5 sql-server sql-server-2012

我运行一个删除记录的存储过程,然后从源系统重新填充它们.SP的删除部分根据表的层次结构进行构造,CHILD_TABLE在从引用的表(PARENT_TABLE)中删除之前从引用表(允许调用它)中删除.我从删除时得到"与REFERENCE约束冲突的DELETE语句..."错误PARENT_TABLE.

delete语句中有一个where子句,当我运行带有相同where子句的select语句时,我返回了11条记录.所以我们试图删除11条记录.

CHILD_TABLEPARENT_TABLE含有FK列的引用PARENT_TABLE.PRIMARY_KEY.但是,当我CHILD_TABLE使用以下任一方法运行select语句时,我得到0行返回:

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

因此,在我看来,SQL Server认为在CHILD_TABLE确实没有的时候有数据.

这个问题看起来像是"与REFERENCE约束冲突的DELETE语句"的副本,而引用表中没有数据,但答案是(释义)"实际上存在引用表中的数据".但是,就我而言,引用的表中确实没有数据.不完全是.

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

任何帮助/指针赞赏.

Kum*_*rsh 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
Run Code Online (Sandbox Code Playgroud)

在这里我知道另一个子表child1。因此,当我尝试像上面那样删除父表时,我会得到类似的错误。

所以我将运行这个脚本,

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'
Run Code Online (Sandbox Code Playgroud)

这将显示第二个子表child1