REPLACE INTOとINSERT ON DUPLICATE KEY UPDATEの違い

MySQL

概要

MySQLの独自拡張であるREPLACE INTOとINSERT … ON DUPLICATE KEY UPDATEが似ている挙動しているので実験してみた。on MySQL 5.1

参考資料

12.2.6. REPLACE 構文
12.2.4.3. INSERT … ON DUPLICATE KEY UPDATE 構文
INSERT IGNORE

http://d.hatena.ne.jp/IT7C/20100715/1279148768

実行例

テーブル作成&初期データ投入

mysql> CREATE TABLE IF NOT EXISTS `color` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `value` varchar(255) NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   UNIQUE KEY `value` (`value`)
    -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO `color` (`id`, `value`) VALUES
    -> (1, 'FF0000'),
    -> (2, '00FF00');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from color;
+----+--------+
| id | value  |
+----+--------+
|  1 | FF0000 |
|  2 | 00FF00 |
+----+--------+
2 rows in set (0.00 sec)

insert intoで更新。行は追加されない。

mysql> INSERT INTO `color` (`value`) VALUES ('FF0000')
    -> on duplicate key update value='FF0000';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from color;
+----+--------+
| id | value  |
+----+--------+
|  1 | FF0000 |
|  2 | 00FF00 |
+----+--------+
2 rows in set (0.00 sec)

replace intoで更新。キー指定されているカラムが重複すると行が追加される。

mysql> replace into color (value) values('FF0000');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from color;
+----+--------+
| id | value  |
+----+--------+
|  3 | FF0000 |
|  2 | 00FF00 |
+----+--------+
2 rows in set (0.00 sec)

mysql> replace into color (value) values('FF0000');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from color;
+----+--------+
| id | value  |
+----+--------+
|  4 | FF0000 |
|  2 | 00FF00 |
+----+--------+
2 rows in set (0.00 sec)

まとめ

  • 既に重複するカラムのレコードがあった場合の挙動が違う
  • insert … on duplicate key: 行がupdateされる
  • replace into … : 行がdeleteされて、insertされる
  • マスタデータの更新にこれらの構文が使ったら便利な構文みたい。
  • 振る舞いが違うから、設計方針に合った構文を使うこと。

コメント