我运行一个删除记录的存储过程,然后从源系统重新填充它们。 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子句中IN
对FK / PK放入where子句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