MySql Update A Joined Table

时间:2011-11-30 19:23:56

标签: mysql join sql-update

我想更新具有多个连接的语句中的表。虽然我知道连接的顺序并不重要(除非你使用的是优化器提示),我命令它们以某种方式最直观地阅读。但是,这导致我想要更新的表不是我开始使用的表,并且我在更新它时遇到问题。

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

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 Too中使用!

4 个答案:

答案 0 :(得分:88)

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子句。

使用JOIN更新不是标准SQL,MySQL和Microsoft SQL Server都已经实现了自己的想法作为标准语法的扩展。

答案 1 :(得分:3)

您对语句的排序错误。您可以阅读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

答案 2 :(得分:0)

这个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>
)

答案 3 :(得分:0)

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

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子句,而不是单表语法