当記事では以下のようなテーブルを想定。
テーブル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# テーブルの構造 $ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 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
1 2 3 4 5 6 7 8 9 10 |
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”があると挿入もしているように思えて紛らわしい)。
コメントを残す