当記事では以下のようなテーブルを想定。
テーブル
# テーブルの構造
$ MariaDB [test]> SHOW columns FROM users;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| tel | varchar(255) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.014 sec)
# テーブルの中身
$ MariaDB [test]> SELECT * FROM users;
+----+--------+------+
| id | name | tel |
+----+--------+------+
| 1 | tanaka | NULL |
| 2 | suzuki | NULL |
| 3 | satou | NULL |
| 4 | yamada | NULL |
| 5 | inoue | NULL |
+----+--------+------+
5 rows in set (0.000 sec)
目次
複数レコードをUPDATEする方法
更新するカラムが1つのとき
複数レコードのUPDATE
# id = 1,2,4のユーザーのtelを更新
$ MariaDB [test]> UPDATE users SET
-> tel = CASE id
-> WHEN 1 THEN '090-1111-1111'
-> WHEN 2 THEN '090-2222-2222'
-> WHEN 4 THEN '090-4444-4444'
-> END
-> WHERE id IN(1, 2, 4);
Query OK, 3 rows affected (0.002 sec)
Rows matched: 3 Changed: 3 Warnings: 0
# テーブルの中身
$ MariaDB [test]> SELECT * FROM users;
+----+--------+---------------+
| id | name | tel |
+----+--------+---------------+
| 1 | tanaka | 090-1111-1111 |
| 2 | suzuki | 090-2222-2222 |
| 3 | satou | NULL |
| 4 | yamada | 090-4444-4444 |
| 5 | inoue | NULL |
+----+--------+---------------+
5 rows in set (0.000 sec)
更新するカラムが2つ以上のとき
複数レコードのUPDATE
# id = 3, 5のユーザーのnameとtelを更新
$ MariaDB [test]> UPDATE users SET
-> name = CASE id
-> WHEN 3 THEN 'satou tarou'
-> WHEN 5 THEN 'inoue hanako'
-> END,
-> tel = CASE id
-> WHEN 3 THEN '090-3333-3333'
-> WHEN 5 THEN '090-5555-5555'
-> END
-> WHERE id IN(3, 5);
Query OK, 2 rows affected (0.005 sec)
Rows matched: 2 Changed: 2 Warnings: 0
# テーブルの中身
$ MariaDB [test]> SELECT * FROM users;
+----+--------------+---------------+
| id | name | tel |
+----+--------------+---------------+
| 1 | tanaka | 090-1111-1111 |
| 2 | suzuki | 090-2222-2222 |
| 3 | satou tarou | 090-3333-3333 |
| 4 | yamada | 090-4444-4444 |
| 5 | inoue hanako | 090-5555-5555 |
+----+--------------+---------------+
5 rows in set (0.000 sec)
おまけ
- レコードごとに別々の値に設定したいカラム
- 全てのレコードに同じ値を設定したいカラム
が混じっているときの更新方法は以下の通り。
複数レコードのUPDATE
UPDATE table_name SET
column1 = CASE id
WHEN 1 THEN 'xxx'
WHEN 2 THEN 'yyy'
WHEN 3 THEN 'zzz'
END,
colmun2 = 'same_value'
WHERE id IN(1, 2, 3);
column1にはレコードごとに別々の値を設定しつつ、column2は全レコードが同じ値になる。
MEMO
“INSERT INTO ~ ON DUPULICATE KEY UPDATE ~”でも一度に複数行の更新をできる。
しかし、当該のSQLはあくまでも「INSERTもしくはUPDATEのどちらかを行う」という処理なので、「複数レコードのUPDATE」のみが目的なら使わない方が良い(後から見たときに”INSERT”があると挿入もしているように思えて紛らわしい)。