MySQLのINSERT…ON DUPLICATE KEY UPDATEの使い方!重複キー時に既存行を更新する方法
INSERT … ON DUPLICATE KEY UPDATEとは
MySQLでテーブルに新しい行を挿入する際、その行がUNIQUEインデックスやPRIMARY KEY(主キー)と重複すると、通常はエラーが発生します。このような問題を回避するために使えるのが「ON DUPLICATE KEY UPDATE」です。INSERT文にこの句を付けると、重複が検出されたときにエラーを返す代わりに、既存の行が新しい値で更新されます。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.61 sec)
ユニークインデックスの作成
次に、Value列に対してユニークインデックスを作成します。これにより同じ値の重複登録が検出されるようになります。
mysql> create unique index value_index on DemoTable(Value);
Query OK, 0 rows affected (0.77 sec)
Records: 0 Duplicates: 0 Warnings: 0
ON DUPLICATE KEY UPDATEを使ったデータ挿入
INSERT文にON DUPLICATE KEY UPDATEを指定してレコードを挿入します。ここでは、重複が発生した場合にValue列の値へ1000を加算するように設定しています。
mysql> insert into DemoTable values(40) on duplicate key update Value=Value+1000;
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(50) on duplicate key update Value=Value+1000;
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(40) on duplicate key update Value=Value+1000;
Query OK, 2 rows affected (0.15 sec)
3つ目のINSERT文では値「40」がすでに存在するため重複となり、「2 rows affected(2行処理)」と表示されています。これは新規挿入ではなく既存行が更新されたことを意味します。
結果の確認
SELECT文でテーブル内の全レコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+-------+
| Value |
+-------+
| 50 |
| 1040 |
+-------+
2 rows in set (0.00 sec)
まとめ
実行結果を見ると、最初に挿入した「40」は2回目の挿入時に重複が検出され、Valueに1000が加算されて「1040」になっているのが分かります。このように、INSERT … ON DUPLICATE KEY UPDATEを使えば、重複キーによるエラーを気にせず、挿入と更新をたった1つのSQL文で処理できます。マスターデータの管理やアクセスカウンター、在庫数の加算処理など、「なければ登録、あれば更新」という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) )