MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで1つのクエリによる挿入・更新は可能?ON DUPLICATE KEY UPDATEの使い方

はい、可能です。ON DUPLICATE KEY UPDATE句を使用することで、INSERT文とUPDATE文の処理を1つのクエリで実現できます。この構文では、主キーや一意インデックスに重複する値を挿入しようとした場合、新規レコードとして挿入される代わりに、既存レコードに対して指定した更新処理が自動的に実行されます。

テーブルの作成

まず、サンプル用のテーブルを作成しましょう。

mysql> create table DemoTable(Id int NOT NULL PRIMARY KEY, Number int);
Query OK, 0 rows affected (0.83 sec)

ここでは Id 列を主キー(PRIMARY KEY)として設定しています。主キーや一意インデックスがあることで、ON DUPLICATE KEY UPDATE が重複を正しく検出できるようになります。

ON DUPLICATE KEY UPDATEを使ったレコードの挿入

次に、insertコマンドでレコードを挿入します。あえて同じIdを持つレコードを複数回挿入してみます。

mysql> insert into DemoTable values(1,190) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(2,130) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(1,190) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 2 rows affected (0.14 sec)
mysql> insert into DemoTable values(2,130) ON DUPLICATE KEY UPDATE Number=Number+10;
Query OK, 2 rows affected (0.17 sec)

注目すべきは、3回目と4回目の実行結果が「2 rows affected」と表示されている点です。これは、新規挿入ではなく既存レコードの更新が行われたことを示しています。

結果の確認

select文でテーブル内のすべてのレコードを表示して確認します。

mysql> select *from DemoTable;

以下の出力が得られます。同じクエリの中で、レコードの挿入と更新が正しく行われたことがわかります。

+----+--------+
| Id | Number |
+----+--------+
| 1  | 200    |
| 2  | 140    |
+----+--------+
2 rows in set (0.00 sec)

動作の仕組み

  • 初回挿入時:Id=1 のレコードはまだ存在しないため、Number=190 として新規挿入されます。
  • 重複検出時:Id=1 のレコードが既に存在するため、Number=Number+10 が実行され、値が190から200へ更新されます。
  • 同様に、Id=2 も130で挿入された後、140に更新されています。

このように ON DUPLICATE KEY UPDATE を使えば、アプリケーション側でレコードの存在確認(SELECT)を行う必要がなく、挿入と更新を1つのSQL文で効率的に処理できます。アトミックに動作するため、同時実行時の競合にも強く、カウンター集計や在庫管理などのユースケースで特に有用です。

  1. MySQLで結果セットを指定した順序どおりに取得する方法

    MySQLでIN句を使ってレコードを取得すると、通常はテーブル内の格納順どおりに結果が返されます。しかし、「指定した値の並び順どおりに結果セットを取得したい」というケースもあります。そんなときは、FIND_IN_SET()関数とORDER BY句を組み合わせることで簡単に実現できます。サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable1563 -> ( -> StudentId int, -> StudentName varchar(20) -> );Query OK

  2. MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法

    MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;