Hatena::ブログ(Diary)

on the center line.

2009-01-28

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

| 12:10

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 以外を条件にして更新ができました。

トラックバック - http://d.hatena.ne.jp/kenpoco/20090128/1233112259