从具有Same Table外键约束的表中删除

时间:2012-10-18 17:49:54

标签: sql foreign-keys constraints sql-delete

我正在尝试运行此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。我很好奇为什么我的删除声明没有过滤掉导致此约束被破坏的公司。

2 个答案:

答案 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...)