MySQLでNULLの場合のみ列を更新し、両方の列がNULLでなければ何もしない方法
列がNULLの場合にのみ新しい値を更新し、すでに値が入っている列はそのまま維持したい——こんな要件はMySQLでよく発生します。このような場合、IF()関数とIS NULL演算子を組み合わせることで簡単に実現できます。両方の列がNULLでない行には、実質的に何も変更が加わりません。
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> create table DemoTable1976
(
FirstName varchar(20),
LastName varchar(20)
);
Query OK, 0 rows affected (0.00 sec)
レコードの挿入
INSERTコマンドを使用して、テーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable1976 values('John','Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1976 values('John',NULL);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1976 values(NULL,'Miller');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1976 values('Chris','Brown');
Query OK, 1 row affected (0.00 sec)現在のレコードを確認する
SELECT文ですべてのレコードを表示してみます。
mysql> select * from DemoTable1976;
出力は以下のようになります。
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John | Doe |
| John | NULL |
| NULL | Miller |
| Chris | Brown |
+-----------+----------+
4 rows in set (0.00 sec)
NULLの場合のみ更新するUPDATEクエリ
ここが本題です。FirstNameがNULLの場合は「David」に更新し、LastNameがNULLの場合は「Brown」に更新します。すでに値が設定されている列は元の値がそのまま返されるため、変更されません。
mysql> update DemoTable1976
set FirstName=if(FirstName IS NULL,'David',FirstName),
LastName=if(LastName IS NULL,'Brown',LastName);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 4 Changed: 2 Warnings: 0
「Changed: 2」と表示されているように、実際に変更されたのは2行だけです。両方の列に値が入っていた行(John Doe、Chris Brown)は更新対象外となっています。
更新後のレコードを確認する
もう一度テーブルの内容を確認してみましょう。
mysql> select * from DemoTable1976;
出力は以下のようになります。
+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| John | Doe |
| John | Brown |
| David | Miller |
| Chris | Brown |
+-----------+----------+
4 rows in set (0.00 sec)
クエリの仕組みの解説
結果を見ると、次のような動作になっていることがわかります。
- 「John / NULL」の行:LastNameのみが「Brown」に更新され、FirstNameは「John」のまま
- 「NULL / Miller」の行:FirstNameのみが「David」に更新され、LastNameは「Miller」のまま
- 「John / Doe」「Chris / Brown」の行:両列ともNULLでないため、一切変更なし
ポイントはIF()関数の構文「IF(条件, 真の場合の値, 偽の場合の値)」です。「FirstName IS NULL」が真であれば「David」をセットし、偽であれば現在のFirstName自身の値を返すことで、結果的に既存の値が保持されます。
代替手段:COALESCE()を使う方法
同様の処理はCOALESCE()関数でも実装可能です。COALESCE()は引数のうち最初のNULLでない値を返すため、次のように書けます。
update DemoTable1976
set FirstName=COALESCE(FirstName,'David'),
LastName=COALESCE(LastName,'Brown');
どちらの方法でも結果は同じですが、IF()の方が「NULLなら更新する」という意図が明確に伝わるため、可読性を重視する場合はIF()の使用をおすすめします。状況に応じて使い分けてください。
-
MySQLの1つのUPDATE文で2つの列を同時に更新する方法
はじめにMySQLでは、1つのUPDATE文の中でSET句を一度だけ使えば、複数の列を同時に更新できます。各列の指定はカンマ(,)で区切って記述します。この記事では、実際にテーブルを作成し、1つのクエリで2つの列(FirstNameとLastName)を更新する手順を解説します。サンプルテーブルの作成まず、以下のようにCREATE TABLE文でテーブルを作成します。mysql> create table DemoTable1909 ( Id int NOT NULL, FirstName varchar(20), LastName varchar(20)
-
MySQLの既存のカラムにNOT NULL制約を設定する方法
MySQLですでに存在するカラムにNOT NULL制約を追加するには、ALTER TABLE文を使用します。この記事では、実際のSQL例を使いながら、NOT NULL制約の設定方法とその動作確認の手順をわかりやすく解説します。 1. テーブルの作成 まず、検証用のサンプルテーブルを作成します。 mysql> create table DemoTable1949 ( UserId int, UserName varchar(20) ); Query OK, 0 rows affected (0.00 sec) この時点では、UserNameカラムにはNUL