今日は、
ORA-01407:(ユーザ名.テーブル名.項目名)をNULLには更新できません。
について、解説します。
開発中に
UPDATE文を作成する際の基本公式は、
UPDATE テーブル名 SET 項目名=値
となりますが、
UPDATE対象の項目がたくさんある場合などちょっと面倒です。
そこでよく使われるのが、
SET句にSELECT文を書いてしまう手法です。
UPDATE tableA A SET (A.項目1, A.項目2, A.項目3) = (SELECT B.項目1, B.項目2, B.項目3 FROM table B where A.key = B.key AND B.項目4 = ‘1’);
のようになります。
このように、
テーブルAとテーブルBを結合し、テーブルBのとある項目でテーブルAの項目を更新したい時によく使う手法です。
しかし、テーブルBのSELECT結果(レコード件数)がテーブルAのレコード件数より少ない場合、
テーブルAにはNULLで埋めようと更新を試みるようです。
これにより、ORA-01407が発生します。
対処として一番簡単なのは、
UPDATE tableA A SET (A.項目1, A.項目2, A.項目3) = (SELECT B.項目1, B.項目2, B.項目3 FROM table B where A.key = B.key)
AND exists (SELECT 0 FROM table B where A.key = B.key AND B.項目4 = ‘1’);
のように
existsを付けて、更新レコード(テーブルA)とSELECTレコード(テーブルB)の件数を揃えてあげることです。