MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでCASE WHEN/THEN/ELSEを使って複数行を一括更新する方法

MySQLの一括更新におけるCASE WHEN/THEN/ELSE構文

MySQLでは、CASE WHEN/THEN/ELSE式を活用することで、1つのUPDATE文で条件に応じた値へまとめて更新できます。大量のレコードを個別にUPDATE文を実行して処理する必要がなく、パフォーマンス面でも有利です。

基本となる構文は以下の通りです。

UPDATE yourTableName SET yourColumnName = CASE
    WHEN yourColumnName = 値1 THEN 更新後の値1
    WHEN yourColumnName = 値2 THEN 更新後の値2
    WHEN yourColumnName = 値3 THEN 更新後の値3
    WHEN yourColumnName = 値4 THEN 更新後の値4
    ELSE yourColumnName
END;

この構文では、各WHEN句の条件が評価され、最初に一致したTHEN句の値に更新されます。どの条件にも一致しない場合は、ELSE句によって元の値がそのまま維持されます。なお、ELSE句を省略するとNULLが設定されてしまうため、意図しないデータ消失を防ぐためにもELSE句の指定は重要です。

サンプルテーブルの作成

それでは、実際に動作を確認するためにテーブルを作成しましょう。テーブル作成のクエリは以下の通りです。

mysql> CREATE TABLE CaseUpdateDemo
-> (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.78 sec)

テストデータの挿入

次に、INSERTコマンドを使っていくつかのレコードを挿入します。

mysql> INSERT INTO CaseUpdateDemo VALUES(1,'John');
Query OK, 1 row affected (0.17 sec)

mysql> INSERT INTO CaseUpdateDemo VALUES(2,'Carol');
Query OK, 1 row affected (0.27 sec)

mysql> INSERT INTO CaseUpdateDemo VALUES(3,'Mike');
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO CaseUpdateDemo VALUES(4,'Bob');
Query OK, 1 row affected (0.15 sec)

挿入したデータの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> SELECT * FROM CaseUpdateDemo;

出力結果

+------+-------+
| Id   | Name  |
+------+-------+
| 1    | John  |
| 2    | Carol |
| 3    | Mike  |
| 4    | Bob   |
+------+-------+
4 rows in set (0.00 sec)

CASE WHEN/THEN/ELSEによる一括更新の実行

準備ができたので、先ほど説明したCASE WHEN/THEN/ELSEを使ったクエリを実行し、Idカラムの値を一括で更新します。

mysql> UPDATE CaseUpdateDemo SET Id = CASE
-> WHEN Id=1 THEN 1001
-> WHEN Id=2 THEN 1002
-> WHEN Id=3 THEN 1003
-> WHEN Id=4 THEN 1004
-> ELSE Id
-> END;
Query OK, 4 rows affected (0.15 sec)
Rows matched: 4 Changed: 4 Warnings: 0

「Rows matched: 4 Changed: 4」と表示されており、4件すべてのレコードが正常に更新されたことがわかります。

更新結果の確認

最後に、SELECT文でIdカラムが正しく更新されているか確認しましょう。

mysql> SELECT * FROM CaseUpdateDemo;

出力結果

+------+-------+
| Id   | Name  |
+------+-------+
| 1001 | John  |
| 1002 | Carol |
| 1003 | Mike  |
| 1004 | Bob   |
+------+-------+
4 rows in set (0.00 sec)

このように、CASE WHEN/THEN/ELSEを使えば、Idの値1〜4がそれぞれ1001〜1004へ一括で更新されました。単一のSQL文で完結するため、アプリケーション側でループ処理を行うよりも効率的で、トランザクション管理もシンプルになります。条件分岐による一括更新が必要な場面で、ぜひ活用してみてください。

  1. PHPとMySQLで時刻を扱う方法|strtotime()とDATE_FORMAT()による形式変換

    PHPで時刻形式を変換する方法 PHPで時刻データを扱う際、strtotime()関数を使えば、「8:55 PM」のような人間が読みやすい12時間制の表記を、データベースで扱いやすい24時間制(HH:MM:SS)へ簡単に変換できます。 PHPコード例 $timeValue = 8:55 PM; $changeTimeFormat = date(H:i:s, strtotime($timeValue)); echo(24時間制への変換結果=); echo($changeTimeFormat); このコードでは、まずstrtotime()が文字列「8:55 PM」をUNIXタイムスタンプに変換

  2. 【解決法】「unix:///var/run/docker.sock」でDockerデーモンに接続できないエラーの直し方

    Dockerは、コンテナを使ってアプリケーションを簡単に作成・デプロイ・実行できることから、近年ますます人気が高まっています。コンテナを利用すれば、開発者はアプリケーション本体に加えて必要なライブラリや依存関係をまとめてパッケージ化し、ひとつの完成品として展開できます。LinuxへのDockerのインストール自体は比較的簡単で、ターミナルで数個のコマンドを実行するだけで利用を始められます。しかしながら、インストールが正常に完了した後でも、すべてのユーザーがスムーズに使えるとは限りません。特によく報告されるのが次のエラーです。Cannot connect to the Docker daemon