裏MySQL入門(17) 基礎編11 REPLACE or INSERT ON DUPLICATE KEY UPDATE

 MERGE,UPSERTと言われる、UPDATE文とINSERT文を条件によって自動的に切り替えることができるSQL文は、MySQLでは2種類用意されています。
REPLACEINSERT ON DUPLICATE KEY UPDATEです。

それぞれの違いは

  1. REPLACE
    • INSERT文と同じ構文でINSERTの部分をREPLACEに置き換えたもの
    • 動作としては通常のINSERTと同じでDUPLICATE KEYが発生した場合に該当のレコードを削除してINSERT
  2. INSERT ON DUPLICATE KEY UPDATE
    • INSERT文のオプションとして記述
    • 動作としては通常のINSERTと同じでDUPLICATE KEYが発生した場合にオプションで指定したUPDATE文を実行

REPLACE文は憶えやすいこともあって、知っている人も多いかと思いますが、アプリケーションで実際に使用する際にはあまり使えなかったりします。というのは、例えばアプリケーションで新規登録と編集を1つのアクションにしたいといった用途に使いたいということがあるかもしれませんが、上記の通りREPLACE文は重複行を削除してしまう為、例えばフォーム入力で変更できない部分、ステータスや作成日時などの変更したくない部分までなくなってしまいます。もちろん編集画面ですべてのカラムが変更できる場合や、hiddenで変更不可能なカラムを入れておけば出来なくはないです。

そこで、大体の場合、重複行処理時にUPDATE条件を指定できるINSERT ON DUPLICATE KEY UPDATEを使うことになります。こちらはアクセスログ解析などを行ないたい時に加算処理を行ったりと詳細なオプションを指定できて便利です。ただ、このまま使うと記述が冗長になりやすいので、自分はアプリケーションのDBクラスで使いやすようにupsertメソッドを作って使っています。やりたいことは、通常のINSERTと同じでDUPLICATE KEYが発生した場合に単純に指定したカラムをUPDATEすればいいので、そういったINSERT ON DUPLICATE KEY UPDATE文を自動生成するようにしておきます。