txqz memo

なければ INSERT、あれば UPDATE

すでにテーブルにある主キーやユニークキーと同じ値をふくむ行を挿入しようとするときに、こちらの想定する振る舞いをさせる方法のまとめ。まぁ、リファレンスマニュアルの INSERT 構文のところを見れば話は終わりなのだけれども。

ID (主キー)
1100
2800
3400
間違って主キーと同じ値を含む行を挿入しようとしたらエラーを出して教えてほしいとき

INSERT INTO test VALUES(1,100); とすると、ERROR 1062 (23000): Duplicate entry '1' for key 1 というエラーが出る。

間違って主キーと同じ値を含む行を挿入しようとしても無視して処理を続行してほしいとき

INSERT IGNORE INTO test VALUES(1,100); とすると、Query OK, 0 rows affected (0.00 sec) と表示される。テーブルは変更されていない。

主キーと同じ値を含む行がないなら新しく挿入し、あるならその行を更新してほしいとき

REPLACE INTO test VALUES(1,500); とすると、Query OK, 2 rows affected (0.00 sec) と表示される。削除してから挿入するので影響された行は2になる。テーブルは;

ID (主キー)
1500
2800
3400

REPLACE INTO test VALUES(4,200); とすると、Query OK, 1 row affected (0.00 sec) と表示される。主キーが4である行はないので、そのまま挿入されて、影響された行は1になる。テーブルは;

ID (主キー)
1500
2800
3400
4200
主キーと同じ値を含む行がないなら新しく挿入し、あるならその行を元のデータを使って更新してほしいとき

INSERT INTO test VALUES(1,100) ON DUPLICATE KEY UPDATE value = value + 100; とすると、Query OK, 2 rows affected (0.00 sec) と表示される。削除してから挿入するので影響された行は2になる。テーブルは;

ID (主キー)
1600
2800
3400
4200

最後の構文は無駄な IF 文を除去するのに最適なのでぜひおさえておきたい。