あれば更新、なければ追加

割と有名どころかもしれないけど、MySQLSQL構文に以下の2つがある。

・INSERT 〜 ON DUPLICATE KEY UPDATE col_name=expression, ... ・REPLACE INTO tbl_name SET col_name=expression, col_name=expression,...

詳細はここでは説明しないが、「あれば更新、なければ追加」という式だ。 通常であれば、Uniqueなキーに対してSELECT 文を発行し、レコードが存在すれば更新するが、なければ追加するという、やや回りくどい方法になってしまうのだが、先の2つの構文はそれを一度に処理することが可能である。

なお、前者はレコードが存在した場合、既存レコードを更新するのに対し、後者は既にあるレコードを削除して追加するという処理になる。 (REPLACEは「あれば更新」という訳ではないか、厳密には)

でもって、Oracleにも似たような構文がある。

・MERGE INTO tbl_name USING source ON condition WHEN MATCHED THEN 〜 WHEN NOT MATCHED THEN 〜

条件式(condition)の真偽により、UPDATEするかINSERTするかを分岐させることが出来る。 IF式に近いのでちょっと発想が異なるかもしれないけど。

「あれば更新、なければ追加」というのはありがちな処理だけにこの手の構文は非常にありがたいのだが、ちょっと方言色が強いかな。 (おそらく標準のSQLにはないのか)

他のDBMSはどうなっているのだろう?