从具有相同表外键约束的表中删除

4

我正在尝试运行这个sql server语句:

delete C from Company C, Company D where C.CompanyID > 1310 AND C.CompanyID != D.ParentID

我遇到了以下SQL错误:

DELETE语句与“FK_Company_Company”约束条件中的相同表引用冲突。该冲突发生在数据库“DevelopmentDB”中,“dbo.Company”表中,“ParentID”列中。

我检查了一下,没有任何公司的ParentID = CompanyID。我很好奇为什么我的删除语句没有过滤掉会导致这个约束条件被破坏的公司。

2个回答

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)

我对你写的第二个查询得到0行感到困惑。如果是这样的话,约束就不是问题了,也不会影响0行。 - Dave
零行意味着任何大于1310的companyid都有parentId作为companyId。你可以尝试不带子查询的select语句来验证是否存在大于1310的companyid。 - RThomas
你能否更新你的问题,指明我们正在讨论的具体的SQL语言类型,比如TSQL、PLSQL、Postgres等。 - RThomas

3
我在一个表格中遇到了这个错误(“DELETE语句与同一表引用约束冲突…”),该表格包含以下列和数据:
| RecordID | ParentRecordID | (other fields...) |
|----------|----------------|-------------------|
|        1 |           null |               ... |   
|        2 |              1 |               ... |

当我尝试在删除记录2之前删除记录1时,出现了错误。在指向列RecordID的列ParentRecordID上设置的同表外键约束阻止了删除:当记录1不再存在时,记录2指向记录1将无效。
我通过首先删除具有非空ParentRecordID值的记录来解决这个问题:
DELETE FROM myTable
WHERE ParentRecordID IS NOT null
  AND (other criteria...)

然后我可以使用额外的DELETE语句删除剩余的记录:

DELETE FROM myTable
WHERE (other criteria...)

1
我认为如果存在多个层次结构,这种方法可能行不通。 - mithun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接