MySQL

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