データがあればUPDATE。なければINSERTの「INSERT ... ON DUPLICATE KEY UPDATE 構文」

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 構文