437 文字
2 分
REPLACE INTOとINSERT ON DUPLICATE KEY UPDATEの違い
概要
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
実行例
テーブル作成&初期データ投入
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される
- マスタデータの更新にこれらの構文が使ったら便利な構文みたい。
- 振る舞いが違うから、設計方針に合った構文を使うこと。
REPLACE INTOとINSERT ON DUPLICATE KEY UPDATEの違い
https://blog.teraren.com/posts/replace-into-insert-on-duplicate-key-update/