1. 導入: なぜNOT NULL制約を適切に設定すべきなのか
データベース設計において、カラムに「NULLを許可するか、しないか」という判断は非常に重要です。NULLは「値が存在しない(不明)」という状態を表しますが、不用意にNULLを許容すると、アプリケーション側で「値がNULLである場合の例外処理」が増え、バグの温床となります。本記事では、MariaDBを例に、NOT NULL制約の基本と現場で意識すべき設計思想を解説します。
2. 基礎知識: NULLとNOT NULLの違い
MariaDBでは、カラム定義時に制約を指定しない場合、デフォルトで「NULLを許可する」設定になります。
NULLを許可する(NULLable): 値が空であってもエラーにならない。
NOT NULL制約: 値が必須となる。空のまま登録しようとするとエラーが発生する。
現場の設計では、原則として「物理的に値が不明な場合」以外は、NOT NULL制約を付与することが推奨されます。これにより、データの整合性が向上し、クエリ実行時の複雑なNULL判定を回避できます。
3. 実装: NOT NULL制約の適用と確認
テーブル作成時に、カラム名の直後にNOT NULLを記述することで制約を適用します。また、既存テーブルの制約を確認するには、SHOW COLUMNSコマンドを使用します。
4. サンプルプログラム: テーブル定義と動作確認
以下に、NOT NULL制約を適用したテーブル作成から、制約によるエラー発生の検証までを行う手順を示します。
-- 1. NOT NULL制約を持つテーブルの作成
-- nameカラムは必須項目として定義
CREATE TABLE user (
id INT,
name VARCHAR(10) NOT NULL
);
-- 2. 制約の確認
-- Null列が'NO'であれば正しく設定されています
SHOW COLUMNS FROM user;
-- 3. 正常なデータの挿入
INSERT INTO user VALUES(1, 'Yamada');
-- 4. NULLを挿入しようとするとエラーが発生
-- ここでエラーが発生し、データの整合性が守られます
INSERT INTO user VALUES(2, NULL);
-- 出力: Column 'name' cannot be null
5. 応用・注意点: 現場で陥りやすい罠
空文字との混同を避ける:
特に文字列型カラムにおいて、「NULL」と「空文字(”)」を混同しないでください。NOT NULL制約を付けていても、空文字は「値がある」とみなされ格納可能です。設計段階で「値が未入力のときはNULLを入れるのか、空文字を入れるのか」という運用ルールを明確にしましょう。
後からの制約追加:
既にデータが入っているテーブルに後からNOT NULL制約を追加する場合、既存のNULLデータが障害となります。その場合は、事前にUPDATE文で値を埋めるか、DEFAULT値を設定してNULLを解消してから制約を追加する手順が必要です。
まとめ:
NOT NULL制約は、データベースの品質を守るための「最初の防波堤」です。可能な限りNOT NULL制約を付与し、アプリケーション側のロジックを簡潔に保つ設計を心がけましょう。

コメント