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 的语法不支持 FROM
、ORDER BY
或 LIMIT
子句,而不是 单表语法。
【讨论】:
感谢@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 更新连接表的主要内容,如果未能解决你的问题,请参考以下文章