MySQLで重複レコードを効率的に置き換える方法|INSERT ON DUPLICATE KEY UPDATEの使い方を解説
MySQLで重複レコードを置き換えつつ、挿入時のエラーを回避したい場合は、INSERT ... ON DUPLICATE KEY UPDATE構文を使用するのが最も効率的な方法です。この構文を使えば、一意(UNIQUE)制約に違反するデータを挿入しようとした際に、エラーを発生させる代わりに既存のレコードを自動的に更新できます。
1. サンプルテーブルの作成
まず、IdとNameの2列に複合ユニーク制約を設定したテーブルを作成します。
mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20),
-> UNIQUE(Id,Name)
-> );
Query OK, 0 rows affected (0.78 sec)
UNIQUE(Id, Name)を指定することで、この2つの値の組み合わせが同じレコードはテーブル内に1つしか存在できなくなります。
2. ON DUPLICATE KEY UPDATEを使ったレコード挿入
次に、INSERT文に「ON DUPLICATE KEY UPDATE」を付けてレコードを挿入します。
mysql> insert into DemoTable values(101,'Chris') on duplicate key update Id=10001,Name='Robert';
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(102,'Mike') on duplicate key update Id=10001,Name='Robert';
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(101,'Chris') on duplicate key update Id=10001,Name='Robert';
Query OK, 2 rows affected (0.10 sec)
実行結果のポイント
・1つ目と2つ目のINSERTは、重複しない新規レコードとして挿入されたため「1 row affected」と表示されます。
・3つ目のINSERTは、(101, 'Chris')という組み合わせがすでに存在するため重複と判定され、代わりにUPDATE処理が実行されました。そのため「2 rows affected」と表示されます。
3. テーブル内のレコードを確認する
SELECT文ですべてのレコードを表示して結果を確認しましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+-------+--------+
| Id | Name |
+-------+--------+
| 102 | Mike |
| 10001 | Robert |
+-------+--------+
2 rows in set (0.00 sec)
結果の解説
3回目のINSERTでは重複が検出されたため、既存レコードがId=10001、Name='Robert'に更新されました。このように、INSERT ... ON DUPLICATE KEY UPDATEを使えば、重複チェックと更新処理を1つのSQL文で完結できるため、アプリケーション側で事前にSELECTで存在確認を行う必要がなく、処理がシンプルかつ高速になります。
補足:REPLACE INTOとの違い
類似の構文として「REPLACE INTO」もありますが、こちらは重複時にレコードを一度削除してから再挿入する動作のため、AUTO_INCREMENTの値が変わったり、削除トリガーが発火したりする点に注意が必要です。既存レコードをそのまま更新したいケースでは、INSERT ... ON DUPLICATE KEY UPDATEの方が安全で効率的な選択となります。
-
MySQLのINSERT INTO SELECT文で複数のテーブルからレコードを挿入する方法
複数のテーブルからレコードを挿入するには、INSERT INTO ... SELECT 文を使用します。この記事では、2つのテーブルのデータを組み合わせて、別のテーブルへレコードを挿入する手順を、実際の実行例とともに解説します。 1つ目のテーブルを作成する まず、挿入元となる1つ目のテーブルを作成しましょう。 mysql> create table DemoTable1943 ( Name varchar(20) ); Query OK, 0 rows affected (0.00 sec) サンプルデータを挿入する INSERTコマンドを使って、テーブルにレコー
-
MySQLで複数のレコードをすばやく一括挿入するクエリの書き方
MySQLで複数のレコードを効率よく挿入したい場合、INSERT文を何度も実行するのではなく、1つのINSERT文で複数行をまとめて指定するのがおすすめです。この方法ならデータベースとの通信回数が減り、処理速度が大幅に向上します。 基本構文 複数のレコードをすばやく挿入するには、単一のINSERT文を使い、以下の構文に従います。 insert into yourTableName values(yourValue1,yourValue2,...N),(yourValue1,yourValue2,...N).....N; ポイントは、各行の値セットをカンマ(,)で区切って並べるだけというシンプル