MySQLのINSERT ... ON DUPLICATE KEY UPDATEの使い方を実例付きで解説
INSERT ... ON DUPLICATE KEY UPDATEとは
INSERT ... ON DUPLICATE KEY UPDATEは、MySQLでよく使われる構文の一つです。この構文を使うと、INSERT実行時に一意キー(UNIQUE KEY)や主キー(PRIMARY KEY)の重複が検出された場合、エラーを返す代わりにUPDATE処理へ自動的に切り替えてくれます。つまり、更新が実行されるのは重複した値が発生した場合のみです。
この仕組みにより、「レコードが存在しなければ追加、すでに存在すれば更新」といういわゆるアップサート(UPSERT)処理を1つのSQL文で簡潔に実装できます。
検証用テーブルの作成
まず、動作を確認するためのテーブルを作成しましょう。ここでは StudentName 列にUNIQUE制約を設定しているのがポイントです。これにより、同名の学生データを挿入しようとした際に重複とみなされます。
mysql> create table DemoTable733 (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(100),
StudentMarks int,
UNIQUE KEY Un_Name (StudentName)
);
Query OK, 0 rows affected (0.60 sec)
INSERT ... ON DUPLICATE KEY UPDATEの実行
続いて、insertコマンドを使ってレコードを挿入していきます。各ステートメントには「重複があった場合は StudentMarks を 86 に更新する」という条件を付けています。
mysql> insert into DemoTable733(StudentName,StudentMarks) values('John',45)
ON DUPLICATE KEY UPDATE StudentMarks=86;
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable733(StudentName,StudentMarks) values('Adam',65)
ON DUPLICATE KEY UPDATE StudentMarks=86;
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable733(StudentName,StudentMarks) values('Carol',75)
ON DUPLICATE KEY UPDATE StudentMarks=86;
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable733(StudentName,StudentMarks) values('John',45)
ON DUPLICATE KEY UPDATE StudentMarks=86;
Query OK, 2 rows affected (0.12 sec)注目すべきは最後のINSERT文です。「John」は1件目ですでに登録済みのためUNIQUEキーの重複が発生し、今回は新規挿入ではなく更新処理が実行されました。
影響を受けた行数(affected rows)を見ると、挿入時は「1 row affected」、更新時は「2 rows affected」と表示されるため、どちらの処理が行われたかを判別できます。
結果の確認
select文ですべてのレコードを表示して結果を確認してみましょう。
mysql> select *from DemoTable733;
上記のクエリを実行すると、次のような出力が得られます。
+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
| 1 | John | 86 |
| 2 | Adam | 65 |
| 3 | Carol | 75 |
+-----------+-------------+--------------+
3 rows in set (0.00 sec)
動作結果のポイント
出力結果から、以下のことが確認できます。
- テーブルには3件のレコードしか存在せず、4回目のINSERTで新しい行は追加されていません。
- 「John」の StudentMarks は、最初に挿入された45ではなく、重複時のUPDATEによって86に更新されています。
- Adam と Carol のスコアは INSERT 時の値(65・75)のまま維持されています。
このように、INSERT ... ON DUPLICATE KEY UPDATEを活用すれば、アプリケーション側で存在チェックを行うことなく、効率的かつ安全にデータの登録・更新を切り分けることができます。在庫管理やユーザープロフィールの更新など、頻繁な書き込みが発生するシステムで特に有効な構文です。
-
MySQLのINSERT…ON DUPLICATE KEY UPDATEの使い方!重複キー時に既存行を更新する方法
INSERT … ON DUPLICATE KEY UPDATEとはMySQLでテーブルに新しい行を挿入する際、その行がUNIQUEインデックスやPRIMARY KEY(主キー)と重複すると、通常はエラーが発生します。このような問題を回避するために使えるのが「ON DUPLICATE KEY UPDATE」です。INSERT文にこの句を付けると、重複が検出されたときにエラーを返す代わりに、既存の行が新しい値で更新されます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable -> ( -> V
-
INSERTコマンド実行時にトリガーでMySQLテーブルを自動更新する方法
MySQLでは、あるテーブルへのINSERT操作をきっかけに、別のテーブルへ自動的にデータを挿入・更新する処理を「トリガー(TRIGGER)」を使って実現できます。本記事では、実際のSQL例を通じて、INSERTコマンド実行時に別テーブルを更新するトリガーの作成手順をわかりやすく解説します。1. 最初のテーブルを作成するまず、データの挿入先となる最初のテーブル「DemoTable1」を作成します。mysql> create table DemoTable1 -> ( -> Id int, -> FirstName varchar(20)