【SQL】UPDATEで「nullには更新できません」の対処法

このページでは、ORACLEデータベースのSQLで、UPDATE文で「nullには更新できません」とエラーになる原因と対処方法を紹介しています。

UPDATE文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】UPDATE文の書き方:サンプル多数あり

UPDATEで「nullには更新できません」になる理由

UPDATE文で、「nullには更新できません」というエラーが出る状況はどういったものかサンプルを元に解説していきます。

次のようなテーブルがあるとします。

create table tab1(
    col1 varchar(5)
    ,col2 varchar(5)
    ,col3 varchar(5) not null
    ,primary key(col1)
);

NOT NULL制約のカラムをNULLに更新した場合

テーブル定義で、NOTNULL制約がついているカラムを、NULL値で更新しようとするとエラーとなります。

先ほどのTAB1テーブルでは、COL3列にNOT NULL制約があるのでNULLが許可されていません。

この状態で、次のようなSQLを実行し、COL3の値をNULLに更新しようとすると「nullには更新できません」というエラーになります。

update tab1 set col3 = NULL where col1 = '00001';

上記の例は非常に分かりやすい例でした。

実際には次のように、別のある表から取得したカラムの値を使って更新するときによく発生します。

このSQLでは、TAB1テーブルのCOL3の値を、TAB2テーブルのCOL3の値で更新しようとしています。このとき、TAB2テーブルの当該レコードのCOL3の値がNULLの場合も

UPDATE 
    tab1 a
    inner join tab1 b on a.col1 = b.col1
SET 
    a.col3 = b.col3
where
    a.col1 = '00001'
;

ちなみに、主キー項目もNULLを許容できないので、エラーとなります

UPDATEで「nullには更新できません」の対処方法

UPDATE文で、「nullには更新できません」というエラーが出ないようにする対処方法はいくつかあります。

NULL値を別の値に変換して更新する

最も簡単な方法が、更新しようとした値がNULL値の場合に別の値に置き換えて更新する方法です。

先ほどのUPDATE文を改良しました。SET句の列の指定をNVL関数を使い「NVL(b.col3,’XXXXX’)」とし、COL3の値がNULLの場合はXXXXXという文字リテラルを返すようにしました。

UPDATE 
    tab1 a
    inner join tab1 b on a.col1 = b.col1
SET 
    a.col3 = NVL(b.col3,'XXXXX')
where
    a.col1 = '00001'
;

NULL値の場合は変更しない方法

UPDATE文で、更新する値がNULLの場合は、CASE式を使って値を変更しないようにすることが出来ます。

次のUPDATE文では、CASE式を使って「WHEN b.col3 IS NOT NULL THEN b.col3」とし、TAB2テーブルのCOL3の値がNULLでない場合は、TAB2テーブルのCOL3の値で更新します。

TAB2テーブルのCOL3の値がNULLの場合は、元のTAB1テーブルのCOL3列の値を使って更新し、実質的に変更しないようにしています。

UPDATE 
    tab1 a
    inner join tab1 b on a.col1 = b.col1
SET 
    a.col3 = CASE
                 WHEN b.col3 IS NOT NULL THEN b.col3
                 ELSE a.col3
             END
where
    a.col1 = '00001'
;

NULL値のレコードを更新対象外とする

UPDATE文で、更新する値がNULLとなるレコードを更新対象外とすることもできます。

次のUPDATE文では、TAB2の抽出条件に「b.col3 is not null」を加え、col3列の値がNULL値のレコードを更新対象から除外しています。

TAB1とTAB2はINNER JOINしているので、更新対象から除外することが出来ます。

UPDATE 
    tab1 a
    inner join tab1 b on a.col1 = b.col1 and b.col3 is not null
SET 
    a.col3 = b.col3
where
    a.col1 = '00001'
;

まとめ

UPDATE文で「nullには更新できません」となる原因は、NULLを許容できない項目に対して、NULL値で更新をしているからです。

対処方法は、NULL値を別の値に置き換えて更新するか、NULL値となるレコードを更新対象外にする方法があります。プログラムの仕様や条件に応じて使い分けてください。

この他にも、UPDATE文の様々な書き方を解説しております。
詳しくは「【SQL】UPDATE文の書き方:サンプル多数あり」で解説しているのでぜひ参考にしてください。