2017/12/07
ORACLEにおけるNULLの扱いには注意が必要であるという話を前回の記事で解説しました。
扱いを間違えると、障害にもつながるNULLですが、その解決策の一つとして「NULLを登録しない・させない」ということについて、本記事で紹介します。
sponsored link
NULLを登録しないためには
代替値を入れる
未知や不明、適用不能、非存在にNULLを入れたいところですが、その場合に代替となる値を入れるようにします。
例えば、顧客マスタの性別項目であれば、1(男性)/2(女性)/0(不明・法人)といったように定義し、NULLを入れないようにルール化します。
NOT NULL制約
代替値を入れる方法だけでは、入れようと思えばNULLを入れることが可能なため、例えば正規のプログラム以外で直接テーブルを更新された場合などにNULLが入りこんでしまう可能性があります。
項目にNOT NULL制約をつけることで、強制的にNULLを登録させないようにすることが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 |
-- テーブル作成時に、NOT NULL制約をつける CREATE TABLE test_table(a NOT NULL); -- テーブル作成時に、NOT NULL制約をつけない CREATE TABLE test_table(a); CREATE TABLE test_table(a NULL); -- 既存テーブルに、NOT NULL制約をつける ALTER TABLE test_table MODIFY(a NOT NULL); -- 既存テーブルに、NOT NULL制約をはずす ALTER TABLE test_table MODIFY(a NULL); |
既存テーブルに、NOT NULL制約をつける場合は、既存データにNULLが存在していないことが条件です。存在している場合、エラーとなります。
デフォルト値の設定
デフォルト値を設定すつことで、NULLを登録しようとした時に代替値を代わりに登録させることが出来ます。
例えば、顧客マスタの性別項目にNULLを登録しようとした時に、自動的に0(不明・法人)を代入するといったことです。
1 2 3 4 5 6 7 8 9 10 |
-- テーブル作成時に、デフォルト値の'0'をつける CREATE TABLE test_table(a DEFAULT '0'); -- 既存テーブルに、デフォルト値の'0'をつける ALTER TABLE test_table MODIFY(a DEFAULT '0'); -- 既存テーブルに、デフォルト値をはずす -- ただし、デフォルト値がNULLという扱い -- デフォルト値を後から消すことは出来ない(テーブルのDROPし再度CREATEが必要) ALTER TABLE test_table MODIFY(a DEFAULT NULL); |
既存テーブルに、デフォルト値をつける場合、既存データのNULLはNULLのまま変わらないので注意。
NULLを登録しないことのメリット・デメリット
メリット
NULLを登録しないとルール化することで、条件指定時や取得したデータを使う時にNULLの考慮をする必要が無くなります。
NULLの場合の考慮が不要となることで、コーディングやテストの工数が減らすことが出来ますし、何よりNULLの扱いを誤ったことで障害になることが無くなります。
デメリット
逆にデータを登録する時に考慮が必要になります。
例えば、上記した顧客マスタの性別項目であれば、1(男性)/2(女性)/0(不明・法人)といったように、NULLを入れたいようなケースの代替値を決めて、徹底する必要があります。
また、NOT NULL制約をつけた場合、意図せずNULLを登録しようとした場合、SQLエラーとなり即障害となる可能性もあります。
そのエラー制御のため、逆にNULLの場合の考慮を徹底しなければならず、コーディングやテストの工数の増加となります。
現実的には
現実的には、全項目にNOT NULL制約をつけるといったことはあまりしません。デメリットの方が大きくなるためです。
コード項目やフラグ項目等、制御や条件としてよく使うような項目に絞って、NOT NULL制約をつけることが多いです。
まとめ
悩ましいNULLに対する対策として、「NULLを登録しない・させない」という解決策について見てきました。
しかし、それはそれでデメリットもあるため、全てが解決というわけにはいきません。
多少負荷は軽減されるかもしれませんが、NULLの取り扱い注意は必須ですね。
関連