[MySQL]:从两个依赖表中删除行
作者:互联网
我试图根据第三个表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
不…
我得到这个错误外键约束失败… – 我相信很多人并不感到惊讶.
Purchase使用t.Transaction_ID的问题是什么? – (因此,这个外键会失败)
或者该表中可能存在其他t.Transaction_ID相关数据(我还没有找到).
编辑:完成错误
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)
解决方法:
只要依赖记录仍存在于另一个表中,就无法从表中删除.在你的情况下,依赖是这样的
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>
)
请注意,这将删除任何具有匹配Client_ID的依赖项的事务(以及通过CASCADE,任何购买),无论其中是否还有任何其他项.如果这不是你想要的,那么问题需要改进.
标签:mysql,foreign-keys,cascading-deletes 来源: https://codeday.me/bug/20190518/1130779.html