MySQL 更新连接表

Posted

技术标签:

【中文标题】MySQL 更新连接表【英文标题】:MySQL update a joined table 【发布时间】:2012-01-10 00:40:12 【问题描述】:

我想更新具有多个连接的语句中的表。虽然我知道连接的顺序并不重要(除非您使用优化器提示),但我以某种方式对它们进行了排序,以便最直观地阅读。但是,这导致我要更新的表不是我开始使用的表,并且我无法更新它。

我想做的一个虚拟例子是这样的:

UPDATE b
FROM tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

这里有很多关于使用联接更新的帖子,但是它们总是首先更新表。我知道这在 SQL Server 中是可能的,希望在 mysql 中也是可能的!

【问题讨论】:

您需要将SET b.val = a.val+c.val 放在FROM ... 之前。见***.com/questions/2334712/… 此示例在 from 之后有 SET,并且该示例更新了连接顺序中的第一个表。我想在连接顺序中间更新一个表。 没关系。即使是这样,您也可以更改连接的顺序 (tableB b JOIN tableA a ON a.a_id = b.a_id)。 【参考方案1】:

MySQL 中的多表 UPDATE 语法与 Microsoft SQL Server 不同。你不需要说你正在更新哪个表,这在你的 SET 子句中是隐含的。

UPDATE tableA a
JOIN tableB b
   ON a.a_id = b.a_id
JOIN tableC c
   ON b.b_id = c.b_id
SET b.val = a.val+c.val
WHERE a.val > 10
    AND c.val > 10;

MySQL 的语法中没有 FROM 子句。

UPDATE with JOIN 不是标准 SQL,MySQL 和 Microsoft SQL Server 都实现了自己的想法作为标准语法的扩展。

【讨论】:

ORDER BY 和 LIM它不用于join's @zloctb,是的,这是一个很好的提示!由于某种原因,MySQL 的多表 UPDATE 语法不支持 ORDER BY 和 LIMIT。参照。 dev.mysql.com/doc/refman/5.6/en/update.html 这是我在大量搜索中遇到的唯一答案,它给出了明确的答案并解释了它与其他 SQL 语言的不同之处和原因。【参考方案2】:

您的语句顺序错误。您可以阅读here 的语法(我知道,这很难阅读。

UPDATE tableA a
  JOIN tableB b
    ON a.a_id = b.a_id
  JOIN tableC c
    ON b.b_id = c.b_id
   SET b.val = a.val+c.val
 WHERE a.val > 10
   AND c.val > 10;

sql fiddle

【讨论】:

该语法不起作用。您必须删除 FROM 部分并将 SET 部分移到 JOIN 之后。【参考方案3】:

另一种正确的结构,我们可以在这种情况下使用:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2.C1
SET T1.C2 = T2.C2, 
    T2.C3 = expr
WHERE condition

以上示例取自:MySQL UPDATE JOIN。

到达MySQL 8.0 Reference Manual我们会发现multiple-table UPDATE syntax这样的描述:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET assignment_list
[WHERE where_condition]

table_references 子句列出了join 中涉及的表。

所以多表 MySQL 的语法不支持 FROMORDER BYLIMIT 子句,而不是 单表语法

【讨论】:

感谢@DavidOliver 修复了我的答案。【参考方案4】:

link 应该为您提供 MySQL 需要的语法,here 就是一个示例。为什么需要连接两个表?是限制更新的记录吗?我问是因为您还可以执行以下操作:

update B set B.x=<value>
    where 
B.<value> is in(
    select A.y 
      from A left outer join B on A.<value>=B.<value>
)

【讨论】:

该示例更新了连接顺序中的第一个表。我想在连接顺序中间更新一个表。 我知道它已经很久了,但是,您可以在任何表中选择一列。如果你只需要更新一张表。

以上是关于MySQL 更新连接表的主要内容,如果未能解决你的问题,请参考以下文章

mysql更新列内部连接另一个表

根据 MySQL 中的连接结果更新表

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

如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?

MySQL 更新连接性能

来自连接表的 MySQL 更新语句(受该表的最新值限制)