ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-05-19 00:03:27  阅读:249  来源: 互联网

标签: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

不…

我得到这个错误外键约束失败… – 我相信很多人并不感到惊讶.

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有