[MySQL]:从两个依赖表中删除行

时间:2010-01-06 16:06:11

标签: mysql foreign-keys cascading-deletes

我试图根据第三个表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)

2 个答案:

答案 0 :(得分:4)

只要依赖记录仍存在于另一个表中,就无法从表中删除。在您的情况下,依赖性就像这样

Transaction <- Purchase -> Item

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

作为这两步法的替代方法,我建议设置一个ON DELETE CASCADE constraint并继续这样做:

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,任何Purchase),其中存在具有匹配Item的从属Client_ID,无论是否存在其中的任何其他项目。如果这不是你想要的,那么问题需要改进。

答案 1 :(得分: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 关于外键约束

相关问题