* 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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS