437 文字
2 分
REPLACE INTOとINSERT ON DUPLICATE KEY UPDATEの違い
2011-04-01

概要#

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される
  • マスタデータの更新にこれらの構文が使ったら便利な構文みたい。
  • 振る舞いが違うから、設計方針に合った構文を使うこと。
REPLACE INTOとINSERT ON DUPLICATE KEY UPDATEの違い
https://blog.teraren.com/posts/replace-into-insert-on-duplicate-key-update/
作者
Yuki Matsukura
公開日
2011-04-01
ライセンス
CC BY-NC-SA 4.0

コメント