Posted at

MySQLで複数行を一括でUPDATEする

More than 5 years have passed since last update.

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 |
+----+------+