在mysql中使用左连接在三个表之间更新

Posted

技术标签:

【中文标题】在mysql中使用左连接在三个表之间更新【英文标题】:update between three tables using left join in 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 表中设置了一个外键约束,阻止您更新行。我不知道你的数据库结构背后的结构或逻辑,所以很遗憾我不能更具体 【参考方案1】:

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

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

你可以做的是:

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

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

【讨论】:

不是专家,所以我不确定 - 但是ON UPDATE CASCADE 呢?它不会也更新引用行吗? @AlonEitan 可以,这是与该主题相关的答案***.com/questions/36807004/how-to-update-primary-key【参考方案2】:

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

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

【讨论】:

以上是关于在mysql中使用左连接在三个表之间更新的主要内容,如果未能解决你的问题,请参考以下文章

mysql多个表之间的连接方式(内连接左连接右连接)delete删除表内数据的方法以及mysql索引

Oracle左连接

具有三个未索引联合表和左连接的 MySQL 查询使数据库负担过重

在 Redshift 更新查询中使用左外连接导致错误:目标表必须是等连接谓词的一部分

在 Postgres 中更新左连接表的 NULL 值

在两个表mysql上左连接时获取最后修改日期