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

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を活用すれば、アプリケーション側で存在チェックを行うことなく、効率的かつ安全にデータの登録・更新を切り分けることができます。在庫管理やユーザープロフィールの更新など、頻繁な書き込みが発生するシステムで特に有効な構文です。

  1. 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

  2. INSERTコマンド実行時にトリガーでMySQLテーブルを自動更新する方法

    MySQLでは、あるテーブルへのINSERT操作をきっかけに、別のテーブルへ自動的にデータを挿入・更新する処理を「トリガー(TRIGGER)」を使って実現できます。本記事では、実際のSQL例を通じて、INSERTコマンド実行時に別テーブルを更新するトリガーの作成手順をわかりやすく解説します。1. 最初のテーブルを作成するまず、データの挿入先となる最初のテーブル「DemoTable1」を作成します。mysql> create table DemoTable1 -> ( -> Id int, -> FirstName varchar(20)