【バルクアップサート】MySQLで一括でUPSERTする方法
構文
普通のupsert文のupdate部分でVALUES(カラム名)を指定すればいいようです。
INSERT INTO
tablename(col_name1, col_name2)
VALUES (1, "hoge"), (2, "fuga")
ON DUPLICATE KEY UPDATE
col_name2 = VALUES(`col_name2`);
具体例
mysql> create table user( userid int(11) primary key not null , nickname varchar(100) not null );
Query OK, 0 rows affected (0.05 sec)
mysql> desc user;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| userid | int(11) | NO | PRI | NULL | |
| nickname | varchar(100) | NO | | NULL | |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into user values (1, "user1");
Query OK, 1 row affected (0.02 sec)
mysql> select * from user;
+--------+----------+
| userid | nickname |
+--------+----------+
| 1 | user1 |
+--------+----------+
1 row in set (0.00 sec)
mysql> insert into user values (1, "enutake"), (2, "pmarusama"), (3, "nanamori") on duplicate key update nickname = values(`nickname`);
Query OK, 4 rows affected (0.02 sec)
Records: 3 Duplicates: 1 Warnings: 0
mysql> select * from user;
+--------+-----------+
| userid | nickname |
+--------+-----------+
| 1 | enutake |
| 2 | pmarusama |
| 3 | nanamori |
+--------+-----------+
3 rows in set (0.00 sec)
これでSQL発行数が減らせて効率的なupsertができます。