web-dev-qa-db-ja.com

MySqlは結合されたテーブルを更新します

複数の結合があるステートメントのテーブルを更新したい。 (オプティマイザーのヒントを使用している場合を除き)結合の順序は実際には重要ではないことはわかっていますが、読みやすいように特定の方法を指定しました。ただし、これにより、更新したいテーブルが元のテーブルではなくなり、更新に問題が発生します。

私がやりたいことのダミーの例は次のようなものです:

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でも可能です。

36
Zugwalt

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を使用したUPDATEは標準SQLではなく、MySQLとMicrosoft SQL Serverの両方が標準構文の拡張として独自のアイデアを実装しています。

91
Bill Karwin

ステートメントの順序が間違っています。構文 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

3

この link は、MySQLが必要とする構文を提供し、 here は例です。 2つのテーブルを結合する必要があるのはなぜですか?更新されるレコードを制限するためですか?あなたが次のようなこともできるので私は尋ねています:

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>
)
0
John Kane

この状況で使用できる別の正しい構成:

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リファレンスマニュアル に到達すると、 複数テーブルUPDATE構文 の説明が見つかります:

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

table_references句は、joinに含まれるテーブルをリストします。

複数テーブルのMySQLの構文は、反対にFROMORDER BYまたはLIMIT句をサポートしていませんtosingle-table syntax

0
simhumileco