我正在尝试运行此sql server语句:
delete C from Company C, Company D where C.CompanyID > 1310 AND C.CompanyID != D.ParentID
我收到以下sql错误:
DELETE语句与SAME TABLE REFERENCE约束“FK_Company_Company”冲突。冲突发生在数据库“DevelopmentDB”,表“dbo.Company”,列'ParentID'。
我检查过,没有公司,其中ParentID = CompanyID。我很好奇为什么我的删除声明没有过滤掉导致此约束被破坏的公司。
答案 0 :(得分:3)
您是否已使用此类内容验证了尝试的结果,以确保您尝试删除的内容是您实际要删除的内容?
select C.<field list> from Company C, Company D
where C.CompanyID > 1310 AND C.CompanyID != D.ParentID
您也可以使用子查询方法尝试删除语句。它可以更容易逻辑地识别您正在运行的查询是您实际想要的。
但是,我总是建议首先选择测试进行验证。
正在运行(如果这是您的预期结果 - 如果不是则修改):
Select <field list> FROM Company WHERE CompanyID > 1310
AND CompanyID NOT IN
(SELECT ParentID FROM Company)
在跑步之前(再次,这只是一个例子)。:
DELETE Company WHERE CompanyID > 1310
AND CompanyID NOT IN
(SELECT ParentID FROM Company)
答案 1 :(得分:1)
我遇到了这个错误(“DELETE语句与SAME TABLE REFERENCE约束冲突......”)在我有一个包含列和数据的表的情况下:
| RecordID | ParentRecordID | (other fields...) |
|----------|----------------|-------------------|
| 1 | null | ... |
| 2 | 1 | ... |
当我的DELETE命令尝试在记录2之前删除记录1时出现错误。在列ParentRecordID
上设置的同一表外键约束指向列RecordID
阻止了删除:当记录1不再存在时,记录2指向记录1是没有效的。
我首先通过删除具有非空ParentRecordID
值的记录解决了这个问题:
DELETE FROM myTable
WHERE ParentRecordID IS NOT null
AND (other criteria...)
然后我可以继续使用额外的DELETE语句删除剩余的记录:
DELETE FROM myTable
WHERE (other criteria...)