元ネタは半年前に書かれたやつだけど、最近はてなブックマークでみかけて気になったので。
CREATE TABLE と JOIN を使わなくても、 INSERT ... ON DUPLICATE KEY UPDATE でいけるんじゃないかなと思った。
> CREATE TABLE data(id INTEGER PRIMARY KEY, name VARCHAR(255), body VARCHAR(255));
> INSERT INTO data (id, name, body) VALUES
(1, 'a', '001'),
(2, 'b', '002'),
(3, 'c', '003'),
(4, 'd', '004'),
(5, 'e', '005'),
(6, 'f', '006')
;
> SELECT * FROM data;
+----+------+------+
| id | name | body |
+----+------+------+
| 1 | a | 001 |
| 2 | b | 002 |
| 3 | c | 003 |
| 4 | d | 004 |
| 5 | e | 005 |
| 6 | f | 006 |
+----+------+------+
6 rows in set (0.00 sec)
> INSERT INTO data (id, body) VALUES (1, 'aaa'), (4, 'ddd')
ON DUPLICATE KEY UPDATE body=VALUES(body);
> SELECT * FROM data;
+----+------+------+
| id | name | body |
+----+------+------+
| 1 | a | aaa |
| 2 | b | 002 |
| 3 | c | 003 |
| 4 | d | ddd |
| 5 | e | 005 |
| 6 | f | 006 |
+----+------+------+
6 rows in set (0.00 sec)
Bulk insert 時の重複対策ぐらいにしか使った事がないので、実は INSERT ... ON DUPLICATE KEY UPDATE には落とし穴があるのかもしれないけど。