【问题标题】:update between three tables using left join in mysql在mysql中使用左连接在三个表之间更新
【发布时间】:2018-04-27 11:03:57
【问题描述】:

我有三个表,想更新这些表中的一些字段但是查询不起作用

这是我的查询:

UPDATE 
customers cust
    left JOIN
contract cont ON cust.Customer_id = cont.Customers_Customer_id
    left JOIN
payments pay ON cust.Customer_id = pay.Customers_Customer_id
SET 
cust.Customer_Name = 'Sara',
cust.Customer_id = '1201941718', 
cust.Customer_Mobile1 = '01258863956',
cust.Customer_Phone = '0224598755', 
cust.Customer_Mail = 'sara@gmail.com', 
cont.Customers_Customer_id = '1201941718', 
pay.Customers_Customer_id = '1201941718'
where cust.Customer_id = '2';

错误:

错误代码:1451。无法删除或更新父行:外键 约束失败(alhawel.payments, CONSTRAINT fk_Payments_Customers1 外键 (Customers_Customer_id) 参考customers (Customer_id) 删除 更新时无操作 没有行动)

【问题讨论】:

  • 这个错误是不言自明的,你不觉得吗?
  • 我更新了外键但是不知道为什么会出现这个信息?
  • 这是数据完整性问题,您在pay 表中设置了一个外键约束,阻止您更新行。我不知道你的数据库结构背后的结构或逻辑,所以很遗憾我不能更具体

标签: mysql


【解决方案1】:

您有一个或多个payments 关联到customer_id = 2

当您将customer_id = 2 更新为customer_id = '1201941718' 时,付款将变为孤立,并且 FK 约束检测到完整性违规。

你可以做的是:

  • 插入新的 Customer_id = '1201941718'
  • 将付款更新为 Customer_id = '1201941718'
  • 删除 Customer_id = 2

但在 db 中,您不应该更改记录的 id。它没有任何好处。如果您需要向实体添加一些元数据,请添加另一个字段并单独保留 PK。

【讨论】:

【解决方案2】:

我认为它不起作用是因为外键中的 ON UPDATE NO ACTION 。当您更新 Customer 表中的 Customer_id 时,指向它的外键将不再有效。

This answer 处理 ON DELETE NO ACTION 但它也适用于更新。我认为您需要修改约束以修复此错误(由于其他原因,这可能不是正确的做法,更多地了解架构可能会得到更好的答案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2011-07-28
    • 2019-11-17
    • 2017-02-15
    • 2016-07-02
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多