概要
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される
- マスタデータの更新にこれらの構文が使ったら便利な構文みたい。
- 振る舞いが違うから、設計方針に合った構文を使うこと。
Comments