4

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

4

2 回答 2

3

您是否使用类似的方法验证了尝试的结果,以确保您尝试删除的内容是您实际打算删除的内容?

select C.<field list> from Company C, Company D 
where C.CompanyID > 1310 AND C.CompanyID != D.ParentID

您也可以使用子查询方法尝试删除语句。它可能更容易从逻辑上识别您正在运行的查询是您真正想要的。

但是,我始终建议使用 select first 进行测试以进行验证。

所以运行(如果这是您的预期结果 - 如果不是,请修改):

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)
于 2012-10-18T18:11:45.393 回答
3

在我有一个包含列和数据的表的情况下,我遇到了这个错误(“DELETE 语句与 SAME TABLE REFERENCE 约束冲突......”):

| RecordID | ParentRecordID | (other fields...) |
|----------|----------------|-------------------|
|        1 |           null |               ... |   
|        2 |              1 |               ... |

当我的 DELETE 命令尝试在记录 2 之前删除记录 1 时出现错误。在ParentRecordID指向列的列上设置的同表外键约束RecordID阻止了删除:记录 2 指向无效在记录 1 不再存在时记录 1。

我通过首先删除具有非空ParentRecordID值的记录来解决该问题:

DELETE FROM myTable
WHERE ParentRecordID IS NOT null
  AND (other criteria...)

然后我可以继续使用附加的 DELETE 语句删除剩余的记录:

DELETE FROM myTable
WHERE (other criteria...)
于 2017-04-12T20:17:09.933 回答