INSERT ON DUPLICATE KEY UPDATE

準備

 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);

使い方

テーブル確認

 SELECT * FROM t1;
 +------+------+------+
 | id1  | id2  | id3  |
 +------+------+------+
 |    1 |    2 |  100 |
 |    2 |    3 |  200 |
 |    1 |    3 |  300 |
 +------+------+------+

ユニーク制約違反のINSERT

上の状態で下のようにINSERTするとユニーク制約でエラーになる。

 INSERT INTO t1 (id1, id2, id3) VALUES (1, 2, 500);

INSERT ON DUPLICATE KEY UPDATE

そこで下のように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

下のようにユニーク制約に関係ない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 |
 +------+------+------+

参考

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html


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

Last-modified: 2013-07-09 (火) 08:47:24