5

我正在尝试根据第三个表 ID 删除两个从属表中的所有行。

表结构:

Transaction
-Transaction_ID (primary)
-Timestamp

Purchase
-Item_ID
-Transaction_ID
-Purchase_ID (primary)

Item
-Item_ID (primary)
-Client_ID

我想从交易/购买中删除与项目中的 Client_ID 匹配的所有行。听起来很简单......即使我可以将我的新手头脑包裹起来......

DELETE dbName.t FROM
  dbName.Transaction t
JOIN
  dbName.Purchase p
 ON
  p.Transaction_ID = t.Transaction_ID
JOIN
  dbName.Item i
 ON
  p.Item_ID = i.Item_ID
WHERE
  Client_ID = 1

没有...

我收到此错误foreign key constraint fails...- 我相信你们中的许多人并不感到惊讶。

购买使用 t.Transaction_ID 的问题是什么?- (因此,这个外键会失败)

或者此表中可能还有其他 t.Transaction_ID 相关数据(我还没有找到)。

编辑:COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction`  
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE)
4

2 回答 2

4

只要从属记录仍然存在于另一个表中,就不能从表中删除。在你的情况下,依赖是这样的

Transaction <- Purchase -> Item

因此,您需要先删除所有购买,然后才能删除交易。

作为该两步方法的替代方法,我建议设置一个ON DELETE CASCADE约束并使用以下方法:

DELETE 
  Transaction 
WHERE 
  Transaction_ID IN (
    SELECT 
      Transaction_ID 
    FROM
      Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID
    WHERE
      Item.Client_ID = <your Client ID here>
  )

请注意,这会删除任何Transaction(并且通过 CASCADE删除 any Purchase),其中存在Item具有匹配项的依赖项Client_ID,无论其中是否有任何其他项。如果这不是您想要的,则需要完善问题。

于 2010-01-06T16:16:57.120 回答
2
Transaction <- Purchase -> Item

您的问题是您在删除购买之前尝试删除交易,正确的方法是删除购买,然后才删除交易,或者您可以在外键上使用ON DELETE CASCADE,看来您正在使用ON DELETE RESTRICT

见这里:http ://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

此外,如果您不确定这是您应该给出完整错误的原因,DBMS 通常会告诉您是什么外键违规引发了错误。

更新:您的错误说得很清楚,问题是您先删除购买然后再删除交易,您需要向后执行或在外键约束上设置ON DELETE CASCADE

于 2010-01-06T16:10:32.207 回答