MySQLで、データが存在する場合は更新を行い、存在しない場合にのみ登録を行いたい場合には、「INSERT ... ON DUPLICATE KEY UPDATE 構文」を利用する。
今回は、サンプルとして複数データを一度に登録する場合である所謂Bulk Insertのサンプルを掲載しておく。
流れとしては、
- UNIQUE インデックスまたは PRIMARY KEYの指定を行う(以下の例では、fruit_nameに対し、UNIQUEインデックスを指定している)
- 以下のような「INSERT ... ON DUPLICATE KEY UPDATE 構文」を含んだSQL文を実行させる
- INSERT文の部分が実行され、重複データと判断された場合には、
ON DUPLICATE KEY UPDATE
以下の更新処理が実行される
INSERT INTO fruit_count(fruit_name, total_count, updated_at) VALUES ('apple', total_count, NOW()), ('banana', total_count, NOW()) ON DUPLICATE KEY UPDATE fruit_name = VALUES(fruit_name), total_count = total_count + 1
テーブルに AUTO_INCREMENT カラムが含まれているとき
上記のままだと、AUTO_INCREMENT カラムの値が激増する。そのため、下記のようにする必要があるようだ。当方未確認。
INSERT INTO fruit_count(fruit_name, total_count, updated_at) VALUES ('apple', total_count, NOW()), ('banana', total_count, NOW()) ON DUPLICATE KEY UPDATE fruit_name = VALUES(fruit_name), total_count = total_count + 1, id=LAST_INSERT_ID(id)
参考
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE 構文