FAT47の底辺インフラ議事録

学んだことのメモ帳です

該当レコードがなければINSERT、あったらUPDATEをするON DUPLICATE KEY UPDATE

普段はまったくSQL書かないんですが、ちょっと必要なタスクができたので書きました。
要件は下記。
・挿入データのPRIMARY KEYが重複していなければINSERT(新規追加)
・PRIMARY KEYが重複していればUPDATE(以下条件のときのみ)
・条件:挿入データの更新日付が、重複しているデータの更新日付よりも新しかった場合のみUPDATEかける

まずは例のSQLを。
例:

INSERT INTO user_login (
 user_id, 
  code,  
  last_update_datetime, 
  ins_datetime, 
)
VALUES (
  10001, 
  'game1', 
  "2013-03-28 21:12:34",  
  now()
) 
ON DUPLICATE KEY UPDATE
  user_id=values(user_id), 
  code=values(code), 
  last_update_datetime= IF(last_update_datetime < values(last_update_datetime), values(last_update_datetime),last_update_datetime);

>・挿入データのPRIMARY KEYが重複していなければINSERT(新規追加)
>・PRIMARY KEYが重複していればUPDATE
この要件はON DUPLICATE KEY UPDATEを利用すると満たせる。

>・条件:挿入データの更新日付が、重複しているデータの更新日付よりも新しかった場合のみUPDATEかける
この要件は、
IF(last_update_datetime < values(last_update_datetime), values(last_update_datetime),last_update_datetime);

で満たせる。
values(hogehoge)という値の指定の仕方は
INSERT時に入るはずだった値を参照することができます。

つまり今回の場合だと、values(user_id)は10001であり、
values(last_update_datetime)は"2013-03-28 21:12:34"が入っているということです。