MySQLで、PrimaryKey以外を条件としてINSERT or UPDATE のような事を実現する

MySQLの REPLACE 文は、プライマリーキー(正確にはPrimaryKey、またはUniqKey)を条件にして一致するものがある場合は DELETE&INSERT、一致するものがなければ INSERT のみを行うという事ができるます。

似たような事を行うものとして、Oracleの MERGE 文がありますが、こちらはプライマリーキーでなくとも任意の条件を指定して INSERT、または UPDATE を行うことができます。

さて、MySQL でも PrimaryKey以外を条件に INSERT or UPDATE を行いたい事があったので、やり方を考えてみました(※PrimaryKey は AutoIncrement になっているという前提)。


CREATE TABLE user (
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(30),
birthday DATE,
PRIMARY KEY(id)

上のような(id,name,birthday)カラムをもつ user テーブルがあったとき、、
name カラムを条件として、(name,birthday) = ('山田太郎','1980-05-15') のレコードを INSERT or UPDATE するSQLを以下に示します。


REPLACE user
SELECT id,name,'1980-05-15'
FROM dual LEFT JOIN user
ON user.name = '山田太郎'

該当レコードが存在する場合、id の値が入るので普通に REPLACE 文が実行されます。該当レコードが存在しない場合、id が NULL となるためマッピングされるレコードなし→INSERT文が実行される→id は AutoIncrement される、となりINSERTが成功します。
(※'山田太郎'が複数いるケースは考えないです・・

以上で、MySQL の REPLACE 文で PrimaryKey 以外を条件にして更新ができました。