HOWTO · MySQL

MySQL で 1つのクエリで複数のテーブルを更新する

この記事では、MySQL で 1つのクエリを使用して複数のテーブルを更新する方法を紹介します。

ユーザーが論理的に関連するテーブルを同時に更新したい場合があります。これらの論理的に関連するテーブルは、いくつかの属性を介して相互にリンクされます。

MySQL で 1つのクエリで複数のテーブルを更新する利点

テーブル内の同様の属性は、更新クエリを作成するために使用されます。更新クエリは、条件に基づいて異なるテーブルで複数の行の更新を実行します。

同様の状況が発生した場合、複数のテーブル更新クエリが適合します。この複数のテーブルの更新クエリを使用する利点は次のとおりです。

  1. これにより、各テーブルで個別に更新するのではなく、行を一度に更新できます。
  2. これにより、さまざまなテーブルのエントリを更新するための全体的な時間も短縮されます。
  3. これにより、テーブルの更新に一貫性がなくなる可能性が低くなります。
  4. 任意の時点でのすべてのテーブルからの同様の応答。

MySQL で 1つのクエリで UPDATE キーワードを使用して複数のテーブルを更新する

複数テーブル更新クエリでは、条件を満たす各レコードが更新されます。基準が複数回一致した場合でも、行は 1 回だけ更新されます。

複数のテーブルを更新する構文は、ORDER BY および LIMIT キーワードでは使用できません。

UPDATE キーワードの構文:

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

Multiple Update は、MySQL 言語に存在する複合キーワードではありません。構文は、join キーワードのように、2つ以上のテーブルのグループ化に役立つさまざまなキーワードの組み合わせによって形成されます。

結合のタイプは、一度に複数のテーブルを更新する単一のクエリを作成するために使用されます。一度に複数のテーブルを更新して、これを理解しましょう。

library および stu_book テーブルという名前の 2つのテーブルについて考えてみます。そして、図書館から学生に本が発行された場合を考えてみましょう。

図書館にある本の数は減りますが、学生がいる本の数は増えます。そして、それは 2つの別々の呼び出しが必要なシナリオです。

RDBMS テーブルの個別の更新を回避するために、1つのクエリで 2つのテーブルの行を更新します。以下は、更新呼び出しの前に実行されるステートメントのリストです。

テーブルに対する実際のクエリの前のクエリのリスト:

  • librarystu_book という名前の 2つのエンティティを作成します。
  • 2つのスキーマは以下で共有されます。

    ライブラリと stu_book テーブルのスキーマ

  • 以下に示すように、いくつかの一般的な値を個別にテーブルに挿入します。

    シナリオを紹介するためにテーブルに挿入されたレコード

  • 両方のテーブルで同時に増加または減少させて、ユースケースを実装してみてください。

    単一のクエリを使用して、2つのテーブルで一度に複数の更新を行う

MySQL ステートメントを実行するためのクエリ:

UPDATE library l, stu_book s
    SET l.book_count = l.book_count - 2,
        s.book_count = s.book_count + 2
WHERE l.id = s.book_id;

上記のクエリでは、内部的に、内部結合は 2つのテーブルを結合し、テーブルの制約をチェックした後、結合されたテーブルを操作します。キーワードが指定されていない場合、内部結合が適用されます。

外部結合、右外部結合などの結合では、ユーザーは正しいキーワードを使用する必要があります。結合は、グループ化される 2つのテーブルが類似/一致する属性を持っている場合にのみ実行できます。

SET キーワードは UPDATE キーワードと一緒に使用され、既存の行に新しい値を設定します。新しいデータを書き込むことにより、古い値を上書きします。

ここで、set は stu_book テーブルのブックカウントを更新し、同じカウント数が library ブックカウントから減少します。

両方のテーブルのすべての行のカウントが更新されるわけではありません。代わりに、制限は WHERE キーワードによって保持されます。

WHERE キーワードは、行の実際のフィルタリングを行います。キーワードは、テーブルの条件をチェックした後、行をフィルタリングします。

ここで、このキーワードは、library_idstu_book テーブルの book_id と一致する必要があることを示しています。

出力には、両方のテーブルで影響を受ける行の総数の結果が一覧表示されます。以下は、影響を受ける行数を確認する出力です。

Query OK, 2 rows affected (0.02 sec)
Rows matched: 2  Changed: 2  Warnings: 0

以下は、ローカル実行環境またはコマンドプロンプトでの上記のクエリの最終出力です。

ローカル実行のスクリーンショット:

更新がトリガーされた後の出力