FrogApps 技術ブログ始めました!
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps
データベースを運用していると、一気にデータを投入したり、更新する必要が出てきます。
MySQLではINSERT文では複数行同時に更新できますが、UPDATEでは用意されていません。
そこで、UPDATEとJOINを組み合わせて、既存のテーブルを一気に更新してみます。
例) original_dataテーブルのbodyの値を複数行一気に更新する
まずは元データを作ります。
CREATE TABLE tbl1(id INTEGER PRIMARY KEY, body VARCHAR(255));
INSERT INTO tbl1(id, body) VALUES(1, '001');
INSERT INTO tbl1(id, body) VALUES(2, '002');
INSERT INTO tbl1(id, body) VALUES(3, '003');
INSERT INTO tbl1(id, body) VALUES(4, '004');
INSERT INTO tbl1(id, body) VALUES(5, '005');
INSERT INTO tbl1(id, body) VALUES(6, '006');
このうち、書き換えたい行の情報をテーブルに挿入します。
CREATE TEMPORARY TABLE tbl1map(tbl1_id INTEGER, body varchar(255));
INSERT INTO tbl1map(tbl1_id,body) VALUES(1,'aaa');
INSERT INTO tbl1map(tbl1_id,body) VALUES(4,'ddd');
そして、INNER JOINを使ってUPDATEします。
UPDATE tbl1
INNER JOIN tbl1map ON tbl1.id=tbl1map.tbl1_id
SET tbl1.body=tbl1map.body;
これで、下記の様にまとめて更新されました。
mysql> SELECT * FROM tbl1;
+----+------+
| id | body |
+----+------+
| 1 | aaa |
| 2 | 002 |
| 3 | 003 |
| 4 | ddd |
| 5 | 005 |
| 6 | 006 |
+----+------+