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

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()の使用をおすすめします。状況に応じて使い分けてください。

  1. 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)

  2. 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