【SQL】【MySQL】 データあればUPDATE、なければINSERT ~ DUPLICATE KEY / 条件付編 ~

はじめに

http://blogs.yahoo.co.jp/dk521123/36225584.html
でINSERT or UPDATEを扱ったが、条件付きでUPDATEできる事を考える

解決方法

 * DUPLICATE KEY UPDATE内で、IF文、または CASE文を使う

IF文

IF(【条件式】, 【真の場合の値】, 【偽の場合の値】)

CASE文

 * 以下の関連記事を参照。
http://blogs.yahoo.co.jp/dk521123/17044389.html

サンプル

CREATE TABLE文

CREATE TABLE daily_events (
  created_on DATE NOT NULL,
  last_event_id INT(11) UNSIGNED NOT NULL,
  last_event_created_at DATETIME NOT NULL,
  PRIMARY KEY (created_on)
);

INSERT or UPDATE 条件付き

1回目(INSERT文)
INSERT INTO daily_events
  (created_on, last_event_id, last_event_created_at)
VALUES
  ('2015-11-20', 1, '2015-12-21 08:00:00')
ON DUPLICATE KEY UPDATE
  last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id),
  last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);
2回目(2015-12-21 08:00:00' < '2015-11-21 08:00:00'ではないので、UPDATEされない)
INSERT INTO daily_events
  (created_on, last_event_id, last_event_created_at)
VALUES
  ('2015-11-20', 1, '2015-11-21 08:00:00')
ON DUPLICATE KEY UPDATE
  last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id),
  last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);
3回目(2015-12-21 08:00:00' < '2016-11-10 08:00:00'なので、UPDATEされる)
INSERT INTO daily_events
  (created_on, last_event_id, last_event_created_at)
VALUES
  ('2015-11-20', 1, '2016-11-10 08:00:00')
ON DUPLICATE KEY UPDATE
  last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id),
  last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);


関連記事

SQL】【MySQL】 データあればUPDATE、なければINSERT ~ DUPLICATE KEY ~

http://blogs.yahoo.co.jp/dk521123/36225584.html