MySQLのINSERT ... ON DUPLICATE KEY UPDATE構文の使い方を解説
INSERT ... ON DUPLICATE KEY UPDATE構文とは
MySQLでは、INSERT ... ON DUPLICATE KEY UPDATE構文を使うことで、挿入しようとしたレコードがユニークキーや主キーの重複によって失敗した場合に、代わりに既存レコードを更新(UPDATE)することができます。新規登録と更新処理を1つのSQL文で実現できるため、アプリケーション側の分岐処理が不要になり、コードがシンプルになります。
基本構文
書式は以下の通りです。
insert into yourTableName values(yourValue1,yourValue2,..N) on duplicate key update yourColumnName1=yourValue1,yourColumnName2=yourValue2,....N;
サンプルテーブルの作成
まず、動作確認用のテーブルを作成します。ここでは「EmployeeName」列にUNIQUE KEYを設定し、名前の重複を防いでいます。
mysql> create table DemoTable1539 -> ( -> EmployeeName varchar(20), -> EmployeeSalary int, -> UNIQUE KEY(EmployeeName) -> ); Query OK, 0 rows affected (0.62 sec)
INSERT文の実行例
ON DUPLICATE KEY UPDATEを付けてレコードを挿入してみましょう。重複が発生しない場合は通常のINSERTとして動作し、重複が発生した場合にはUPDATE句の内容で既存行が更新されます。
mysql> insert into DemoTable1539 values('Chris',4500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1539 values('David',5500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1539 values('Chris',4500) on duplicate key update EmployeeName='Robert',EmployeeSalary=8500;
Query OK, 2 rows affected (0.14 sec)
3つ目のINSERT文では、すでに存在する「Chris」を挿入しようとしたため重複が検出され、既存レコードが「Robert / 8500」に更新されました。このとき「Query OK, 2 rows affected」と表示される点に注目してください。更新が発生した場合は影響行数が2として返されます。
結果の確認
SELECT文ですべてのレコードを表示します。
mysql> select * from DemoTable1539;
実行結果は以下の通りです。
+--------------+----------------+ | EmployeeName | EmployeeSalary | +--------------+----------------+ | Robert | 8500 | | David | 5500 | +--------------+----------------+ 2 rows in set (0.00 sec)
動作のポイント
- 重複キーが存在しない場合:通常のINSERTとして1行追加されます(影響行数は1)。
- 重複キーが存在する場合:指定した列の値で既存行が更新されます(影響行数は2)。
- 値が変更されない更新の場合:MySQLのバージョンや設定によっては影響行数が0として返されることがあります。
このように、INSERT ... ON DUPLICATE KEY UPDATEを使えば、UPSERT(挿入または更新)の処理を効率的に記述できます。在庫管理やカウンター集計など、同一キーのレコードを頻繁に扱う場面で特に有用な構文です。
-
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(2
-
MySQLで主キー(AUTO_INCREMENT)をリセットする方法
MySQLで主キー(AUTO_INCREMENT)の値をリセットするには、まずTRUNCATE TABLEでテーブルを空にし、その後ALTER TABLEでAUTO_INCREMENTの開始値を設定します。この記事では、具体的な手順をサンプルコードとともに解説します。 1. サンプルテーブルの作成 まず、AUTO_INCREMENT付きの主キーを持つテーブルを作成します。 mysql> create table DemoTable1929 ( UserId int NOT NULL AUTO_INCREMENT, PRIMARY KEY(UserId) )