MySQLで特定の1行だけ除外して全レコードを更新する方法|IF()関数とWHERE句の使い分け
はじめに
MySQLでテーブル内のほぼすべてのレコードを更新したいけれど、特定の1行(特定の値を持つ行)だけは除外して元の値を維持したい——そんな場面はよくあります。本記事では、IF()関数を使う方法と、WHERE句を使う方法の2つのアプローチを、実際に動作するサンプルコードと実行結果付きでわかりやすく解説します。
サンプルテーブルの作成
まず、顧客情報を管理するテーブルを作成します。「isMarried」カラムは結婚しているかどうかを 0(未婚)/1(既婚)で表すboolean型です。
mysql> create table DemoTable736 (
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName varchar(100),
isMarried boolean
);
Query OK, 0 rows affected (0.53 sec)
レコードの挿入
INSERT文で6件のデータを登録します。
mysql> insert into DemoTable736(CustomerName,isMarried) values('Chris',0);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Robert',0);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('David',0);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Mike',0);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Bob',0);
Query OK, 1 row affected (0.20 sec)
現在のデータを確認
SELECT文でテーブルの中身を確認しておきましょう。
mysql> select *from DemoTable736;
実行結果は以下の通りです。
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 0 | | 2 | Robert | 0 | | 3 | David | 0 | | 4 | Mike | 0 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
方法1:IF()関数を使って特定の行だけ除外する
IF()関数は「IF(条件, 真の場合の値, 偽の場合の値)」という形式で動作します。この性質を利用すると、1つのUPDATE文の中で「条件に合致する行だけ値を維持し、それ以外の行を一括更新」することができます。
ここでは、CustomerId=6(Bob)以外のisMarriedをすべて1に更新します。Bobの行には現在の値(isMarried自身)を代入することで、実質的に更新対象から除外します。
mysql> update DemoTable736 set isMarried=IF(CustomerId=6,isMarried,1); Query OK, 4 rows affected (0.13 sec) Rows matched: 6 Changed: 4 Warnings: 0
「Rows matched: 6 / Changed: 4」という出力から、評価対象は6行だったものの、実際に値が変化したのは4行だけであることが分かります。Carol(すでに1が設定済み)とBob(除外対象)の値は変わっていません。
方法2:WHERE句で更新対象を絞る
「特定の行はそもそも更新したくない」だけであれば、WHERE句で除外するのが最もシンプルで可読性の高い方法です。比較演算子 <>(≠)や != を使います。
mysql> update DemoTable736 set isMarried=1 where CustomerId<>6;
WHERE句方式は意図が明確で、インデックスが利用できる場合はパフォーマンス面でも有利です。一方、IF()関数方式は「除外する行には別の値を設定したい」「1文で処理を完結させたい」といったケースで活躍します。
更新結果の確認
もう一度SELECT文を実行して、更新後の状態を確認しましょう。
mysql> select *from DemoTable736;
実行結果は以下の通りです。
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 1 | | 2 | Robert | 1 | | 3 | David | 1 | | 4 | Mike | 1 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
Bob(CustomerId=6)だけが元の値 0 を維持し、それ以外の5行がすべて 1 に更新されていることが確認できます。
まとめ
MySQLで特定の1行だけ除外して残りを一括更新するには、次の2つの方法があります。
- IF()関数:
IF(除外条件, 現在の値, 更新後の値)のように記述し、除外対象の行には元の値を代入する。 - WHERE句:
UPDATE ... WHERE 対象外のカラム <> 値として、更新対象から物理的に除外する。
用途に応じて使い分けることで、安全かつ効率的にデータを更新できます。なお、本番環境でUPDATE文を実行する前には、必ずSELECT文で対象行を確認するか、トランザクション内で動作検証を行うことをおすすめします。
-
MySQLで単一の列(カラム)の値のみを更新する方法
MySQLでは、UPDATE文を使うことで、テーブル内の特定の列(カラム)の値だけを簡単に更新できます。この記事では、サンプルテーブルを作成し、単一の列の値のみを更新する手順を具体例とともにわかりやすく解説します。 1. サンプルテーブルの作成 まず、テーブルを作成しましょう。 mysql> create table DemoTable1605 -> ( -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> StudentName varchar(20), -> Stude
-
MySQLで特定の値だけを検索結果の最後に並び替える方法
MySQLで特定の値を最後に並び替える方法 データベースを扱っていると、「不明」や「未設定」を意味する特定の値だけを、検索結果の一番最後に表示したいケースがあります。MySQLでは、ORDER BY句に比較式を組み合わせることで、このような並べ替えを簡単に実現できます。ここでは、テーブル作成から動作確認まで、サンプルコードとともに手順を解説します。 ステップ1:サンプルテーブルを作成する まず、氏名データを格納するためのテーブルを作成します。 mysql> create table demo57-> (-> id int not null auto_increment pr