【问题标题】:DELETE all using Left join of 3 tables使用 3 个表的左连接删除全部
【发布时间】:2017-01-03 19:15:25
【问题描述】:
SELECT * FROM property
LEFT JOIN installmentagreement
ON property.PId=installmentagreement.PId
LEFT JOIN installments
ON installmentagreement.Id=installments.Id
LEFT JOIN rentagreement
ON property.PId=rentagreement.PId
WHERE property.PId=39

这是按预期工作的 SELECT 查询。我想删除这个 SELECT 查询的结果。我使用了这个查询。

DELETE FROM property( SELECT * FROM property
LEFT JOIN installmentagreement
ON property.PId=installmentagreement.PId
LEFT JOIN installments
ON installmentagreement.Id=installments.Id
LEFT JOIN rentagreement
ON property.PId=rentagreement.PId
WHERE property.PId=39)

还有这个。

DELETE FROM property
LEFT JOIN installmentagreement
ON property.PId=installmentagreement.PId
LEFT JOIN installments
ON installmentagreement.Id=installments.Id
LEFT JOIN rentagreement
ON property.PId=rentagreement.PId
WHERE property.PId=39

但它返回语法错误。我想将 SELECT 查询转换为 DELETE 查询。我使用的数据库是 MySQL。如果有任何其他更好的解决方案,请提出建议。请帮忙!

【问题讨论】:

  • ehrm...这是LEFT JOIN,所以这不应该只是DELETE FROM property WHERE PId = 39吗?
  • 使用 cte,也许...假设您尝试从连接中的所有表中删除。
  • 不,实际上“InstallmentAgreement”和“RentAgreement”表包含“Property”表的外键。而“Installments”表包含“InstallmentAgreement”表的外键

标签: mysql sql left-join sql-delete


【解决方案1】:

为了清楚起见,我建议使用别名:

SELECT *
FROM property as p
LEFT JOIN installmentagreement as ia
ON p.PId=ia.PId
LEFT JOIN installments as i
ON ia.Id=i.Id
LEFT JOIN rentagreement as ra
ON p.PId=ra.PId
WHERE p.PId=39

然后您可以轻松转换为删除语句,如下所示:

delete p
FROM property as p
LEFT JOIN installmentagreement as ia
ON p.PId=ia.PId
LEFT JOIN installments as i
ON ia.Id=i.Id
LEFT JOIN rentagreement as ra
ON p.PId=ra.PId
WHERE p.PId=39

如果您想在删除 property 记录之前从某些左连接表中删除记录,您可以在删除语句中轻松更改别名:

delete ra
FROM property as p
LEFT JOIN installmentagreement as ia
ON p.PId=ia.PId
LEFT JOIN installments as i
ON ia.Id=i.Id
LEFT JOIN rentagreement as ra
ON p.PId=ra.PId
WHERE p.PId=39

【讨论】:

  • 我的朋友这个查询很好,但在记录上它给了我外键约束错误。实际上,表“InstallmentAgreement”和“RentAgreement”包含表“Property”的外键。而表“Installments”包含表“InstallmentAgreement”的外键。你能修复这个查询来解决这个约束吗?根据错误,我的理解是首先我必须从包含外键的表中删除行,即“RentAgreement”、“Installments”、“InstallmentAgreement”,然后从表属性中删除。
  • 按此顺序删除 - ra、ia、i 和 p。
  • 试过了。仍然没有运气。错误“无法删除或更新父行:外键约束失败 (pak.installmentagreement, CONSTRAINT installmentagreement_ibfk_1 FOREIGN KEY (PId) REFERENCES property (PId))”
  • 如果在p之前删除ia,就不会出现这个错误了。
【解决方案2】:

MySQL 支持在一个语句中从多个表中删除,但您需要指定要从中删除的表:

DELETE p, ima, i, ra
    FROM property p LEFT JOIN
         installmentagreement ima
         ON p.PId = ima.PId LEFT JOIN
         installments i
         ON ima.Id = i.Id LEFT JOIN
         rentagreement ra
         ON p.PId = ra.PId
WHERE p.PId = 39;

当然,您不必在 DELETE 之后包含所有四个表,只需包含您要从中删除的表即可。

【讨论】:

  • 我的朋友这个查询很好,但在记录上它给了我外键约束错误。实际上,表“InstallmentAgreement”和“RentAgreement”包含表“Property”的外键。而表“Installments”包含表“InstallmentAgreement”的外键。你能修复这个查询来解决这个约束吗?根据错误,我的理解是首先我必须从包含外键的表中删除行,即“RentAgreement”、“Installments”、“InstallmentAgreement”,然后从表属性中删除。
  • @HaseebAhmed 。 . .我不知道它是否会有所作为,但你可以试试delete ra, i, ima, p。您可能有其他记录正在生成外键问题。
  • 试过了。仍然没有运气。错误“无法删除或更新父行:外键约束失败 (pak.installmentagreement, CONSTRAINT installmentagreement_ibfk_1 FOREIGN KEY (PId) REFERENCES property (PId))”
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2014-10-29
  • 2015-03-15
  • 1970-01-01
  • 2022-11-18
  • 2019-03-29
  • 1970-01-01
相关资源
最近更新 更多