Navicatブログ

1つのステートメントで複数のテーブルを更新する 2022年11月17日  Robert Gravelle

よくご存じのとおり、複数のサーバーにヒットすると、アプリケーションの速度が低下する可能性があります。そのため、開発者はできるだけ少ないステートメントを使用してデータを更新する最も効率的な方法を見つけようとします。結局のところ、SQL UPDATEステートメントは、この構文を使用して複数のテーブルからのフィールドの設定をサポートします:

UPDATE table1, table2, ...
    SET column1 = value1,
        column2 = value2,
        ...
[WHERE conditions]

構文は、結合キーワードのように、2つ以上のテーブルのグループ化に役立つ様々なキーワードの組み合わせによって形成されます。

本日のブログでは、マルチテーブルUPDATEステートメントの概要と、MySQL 8およびNavicat Premium 16を使用した例を紹介します。

注意事項

2つのテーブル更新を1つのステートメントに結合することには、制限や癖がないわけではありません。注意すべき点を次に示します:

  • 複数テーブルのUPDATEクエリでは、条件を満たす各レコードが更新されます。条件が複数回一致した場合でも、行は1回だけ更新されます。
  • 複数のテーブルを更新する構文は、ORDER BYキーワードおよびLIMITキーワードと共に使用できません。

そのため、複数テーブルのUPDATEステートメントは非常に効率的ですが、全ての状況に適しているわけではありません

実際の例

複数テーブルのUPDATEステートメントを試すために、"library"と"book"という名前の2つのテーブルを作成し、図書館から1冊以上の本が借りられるケースを考えます。そうすることは、本の数を減らしながら、本の数を増やします。結局のところ、これは2つの別々のステートメントを1つのUPDATEクエリに結合する理想的なシナリオです。これにより、サーバーへの別々の呼び出しが回避され、非常に効率的な操作になります。

各テーブルの定義と内容は次のとおりです:

libraryテーブル

library_table_definition (32K)

library_table_contents (18K)

bookテーブル

book_table_definition (38K)

book_table_contents (17K)

両方のテーブルを更新するクエリは次のとおりです:

UPDATE library l, book b
    SET l.book_count = l.book_count - 2,
        b.book_count = b.book_count + 2
WHERE l.id = b.book_id
AND b.id = '1AG';

上記のクエリでは、l.id = b.book_id条件は、2つのテーブルを結合する内部結合として機能し、テーブルの制約を確認した後、結合されたテーブルに作用します。一方、b.id = '1AG'条件は、ターゲット行をユーザー'1AG'に関連する行にさらに減らします。

外部結合や右外部結合などの他の結合タイプも同様に使用できます。唯一の緩和要素は、グループ化される2つのテーブルが類似/一致する属性を持っている必要があることです。

通常の(単一テーブルの)UPDATEステートメントと同様に、SETキーワードはUPDATEキーワードと共に使用され、既存の行に新しい値を設定します。それにより古い値が新しいデータで上書きされます。以下でNavicatでのクエリ結果を確認できます:

update_result (44K)

予想どおり、ユーザー '1AG'および本103の本の数は両方のテーブルで更新されました。

updated_table_contents (27K)

結論

本日のブログでは、複数テーブルのUPDATEステートメントの概要と、MySQL 8およびNavicat Premium 16を使用した例を紹介しました。ここでの教訓は、複数テーブルのUPDATEステートメントは、関連するテーブル列のインクリメントやデクリメントなどの数学演算を適用するのに最適であるということです。

ブログのアーカイブ
シェア