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

Der*_*air 5 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
Run Code Online (Sandbox Code Playgroud)

我想从事务/购买中删除与项目中的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
Run Code Online (Sandbox Code Playgroud)

不...

我得到了这个错误foreign key constraint fails...- 我相信很多人并不感到惊讶.

Purchase使用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)
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 4

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

Transaction <- Purchase -> Item
Run Code Online (Sandbox Code Playgroud)

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

作为两步方法的替代方法,我建议设置一个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>
  )
Run Code Online (Sandbox Code Playgroud)

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