MySQLで複数レコードを更新するUPDATEの方法

当記事では以下のようなテーブルを想定。

テーブル


# テーブルの構造
$ 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”があると挿入もしているように思えて紛らわしい)。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です