MySQLのReplaceって更新するんじゃないの?

mysql tips

 

普段自分はあまり使わないのだけれど、MySQLのREPLACEでハマったので、備忘録。
REPLACEについての認識がそもそも間違っていただけなんだけれども。

REPLACEって、
「もしテーブル内の古い行がPRIMARY KEYかUNIQUEインデックスの新しい行と同じ値を持っていれば、該当するデータを更新する意外INSERTと同じ」
というSQLだとおもっていたのだけれども、実際は、
「もしテーブル内の古い行が PRIMARY KEY か UNIQUE インデックスの新しい行と同じ値を持っていれば、古い行は新しい行が挿入される前に削除されるという事以外、INSERT と同じ」
ということでした。

要は、REPLACEUPDATEではなく、DELETE+INSERTなんですね。

DELETE+INSERTですので、一部のデータを更新したくなくても、フィールドの定義で決めた初期値になってしまいます。注意しないと。

UPDATEをしたければ、INSERT ON DUPLICATE KEY UPDATEを使います。
INSERT ON DUPLICATE KEY UPDATEですが、INSERTのオプションとして使用して、「DUPLICATE KEYが発生した場合にオプションで指定したUPDATE文を実行」するものです。

でも私感ですが、実際プログラムを組む上ではREPLACEもINSERT ON DUPLICATE KEY UPDATE使用しない方がよいかと私は思います。更新するんだか挿入するんだかわからないSQLなんて、気持ち悪いですし、バグを生む原因にもなりますしね。