概要
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