MySQL

2014-02-09, mysql

INSERTとIGNOREとREPLACE

テーブルに列を追加していく際に、キーの重複があったらどうするか、というのは毎回様々なパターンでの検討が必要な複雑な事項です。以下のテーブル定義を例に3通りの追加方法を検証します。

mysql> CREATE TABLE t (a INT PRIMARY KEY,v0 INT DEFAULT 0,v9 INT DEFAULT 9);
mysql> INSERT INTO t VALUES (0,0,0);
mysql> SELECT * FROM t;
+---+------+------+
| a | v0 | v9 |
+---+------+------+
| 0 | 0 | 0 |
+---+------+------+

INSERT

主キーの値が0のレコードは既に存在する状態で、同じ値のINSERT分を発行すると通常はエラーが発生しますが、INSERT IGNOREと記述する事で、エラーを回避することができます。この場合、文字通りIGNORE(無視)されるだけで、テーブル内のデータは一切変化しません。

mysql> INSERT IGNORE INTO t (a,v0) VALUES (0,10);
Query OK, 0 rows affected (0.00 sec)

INSERT .. ON DUPLICATE KEY

こいつはトリッキーな印象がありますが、キーが重複したら後半のUPDATE文が実行される、というものです。UPDATE文らしい記述になっていますが、WHERE句が無くスッキリしています。SQLをラップする言語(JavaとかPHP)の側で、この手の分岐を書く事は多いので、これは知っておくと便利ではないでしょうか。

mysql> INSERT INTO t (a,v0) VALUES (0,10) ON DUPLICATE KEY UPDATE v0 = 11;
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM t;
+---+------+------+
| a | v0 | v9 |
+---+------+------+
| 0 | 11 | 0 |
+---+------+------+

REPLACE

最後はREPLACEです。これはINSERT文と構文がそっくりな上、行の存在チェックを行う事無く勝手に上書きしてくれる便利な構文なのですが、実は内部では「当該キーのレコードを削除してから、改めて追加」という動作をしている点に注意が必要です。先述の「ON DUPLICATE..」を使った際と違って、明示されていない列の値がデフォルト値に戻ってしまっています。

mysql> REPLACE INTO t (a,v0) VALUES (0,10);
Query OK, 2 rows affected (0.00 sec)

mysql> SELECT * FROM t;
+---+------+------+
| a | v0 | v9 |
+---+------+------+
| 0 | 10 | 9 |
+---+------+------+

参考URL

この記事は役に立ちましたか?