在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
, CONSTRAINTfk_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索引
具有三个未索引联合表和左连接的 MySQL 查询使数据库负担过重