* INSERT ON DUPLICATE KEY UPDATE [#g1eebbba]
** 準備 [#k3fe090b]
CREATE TABLE `t1` (
`id1` int(11) DEFAULT NULL,
`id2` int(11) DEFAULT NULL,
`id3` int(11) DEFAULT NULL,
UNIQUE KEY `t1_unique_id1_id2` (`id1`,`id2`)
);
INSERT INTO `t1` VALUES (1,2,100),(2,3,200),(1,3,300);
** 使い方 [#df061667]
*** テーブルの確認 [#u29f64e1]
*** テーブル確認 [#u29f64e1]
SELECT * FROM t1;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1 | 2 | 100 |
| 2 | 3 | 200 |
| 1 | 3 | 300 |
+------+------+------+
*** ユニーク制約違反のINSERTをする [#jf74882d]
*** ユニーク制約違反のINSERT [#jf74882d]
上の状態で下のようにINSERTするとユニーク制約でエラーになる。
INSERT INTO t1 (id1, id2, id3) VALUES (1, 2, 500);
*** INSERT ON DUPLICATE KEY UPDATEする [#jc039d8d]
*** INSERT ON DUPLICATE KEY UPDATE [#jc039d8d]
そこで下のようにINSERT ON DUPLICATE KEY UPDATEすると、
INSERT INTO t1 (id1, id2, id3) VALUES (1, 2, 500) ON DUPLICATE KEY UPDATE id3 = 600;
下のようにid3が600でUPDATEされる。
SELECT * FROM t1;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1 | 2 | 600 |
| 2 | 3 | 200 |
| 1 | 3 | 300 |
+------+------+------+
*** ユニーク制約じゃないINSERT [#i46ae846]
下のようにユニーク制約に関係ないINSERTは、
INSERT INTO t1 (id1, id2, id3) VALUES (4, 4, 700) ON DUPLICATE KEY UPDATE id3 = 800;
そのままINSERTされる。
SELECT * FROM t1;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1 | 2 | 600 |
| 2 | 3 | 200 |
| 1 | 3 | 300 |
| 4 | 4 | 700 |
+------+------+------+
** 参考 [#dd4fdf0d]
http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html