[MariaDB]NOT NULL 制約と NULL を許容した時の動作
公開日:2026-01-13
更新日:2026-01-13
更新日:2026-01-13
1. 概要
NOT NULL 制約と NULL を許容した時の動作についてです。
NOT NULL 制約を付けると、NULL を禁止にできます。
レコードの追加・変更時に NOT NULL 制約を付けたカラムを NULL にしようとするとエラーが発生して、NULL が入るのを防ぎます。
値が NULL のデータがあると、システム上問題となる場合に、NOT NULL 制約を付けます。
例えば、username, email など、システム上、必須となるカラムです。
NOT NULL 制約を付けることで、システムにバグがあっても、NULL 以外の値が入ってることが保証されます。
また、ステータスや種別などを持つ場合、入力必須でない場合は、0 や -1 などを未入力値として扱わずに、NULL を許容することを検討してください。
NOT NULL 制約を付けると、NULL を禁止にできます。
レコードの追加・変更時に NOT NULL 制約を付けたカラムを NULL にしようとするとエラーが発生して、NULL が入るのを防ぎます。
値が NULL のデータがあると、システム上問題となる場合に、NOT NULL 制約を付けます。
例えば、username, email など、システム上、必須となるカラムです。
NOT NULL 制約を付けることで、システムにバグがあっても、NULL 以外の値が入ってることが保証されます。
また、ステータスや種別などを持つ場合、入力必須でない場合は、0 や -1 などを未入力値として扱わずに、NULL を許容することを検討してください。
2. 動作確認
SQL
CREATE TABLE articles (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
category_id INT NOT NULL, # NOT NULL 制約
value INT
);
# category_id を未指定で追加
INSERT INTO articles (title) VALUES ('記事1-1');
# エラー:ERROR 1364 (HY000): Field 'category_id' doesn't have a default value
# category_id を指定して追加
INSERT INTO articles (title, category_id) VALUES ('記事1-1', 1);
# 正常に追加できる
# category_id を NULL に更新
UPDATE articles SET category_id = NULL WHERE ID = 1;
# エラー:ERROR 1048 (23000): Column 'category_id' cannot be null3. NULL を許容した場合の動作
SQL
CREATE TABLE articles (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
value INT
);
INSERT INTO articles (title, value) VALUES (NULL, NULL), ('', NULL), ('A', NULL), ('B', 0), ('C', 1);
SELECT * FROM articles;
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 1 | NULL | NULL |
# | 2 | | NULL |
# | 3 | A | NULL |
# | 4 | B | 0 |
# | 5 | C | 1 |
# +----+-------+-------+
# 空文字で検索。NULL はヒットしない
SELECT * FROM articles WHERE title = '';
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 2 | | NULL |
# +----+-------+-------+
# IS NULL で検索。空文字はヒットしない
SELECT * FROM articles WHERE title IS NULL;
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 1 | NULL | NULL |
# +----+-------+-------+
# INT のカラムを 0 で検索。NULL はヒットしない
SELECT * FROM articles WHERE value = 0;
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 4 | B | 0 |
# +----+-------+-------+
# INT のカラムを IS NULL で検索。INT でも IS NULL で検索できる。0 はヒットしない
SELECT * FROM articles WHERE value IS NULL;
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 1 | NULL | NULL |
# | 2 | | NULL |
# | 3 | A | NULL |
# +----+-------+-------+
# 文字列長の取得。NULL は NULL が返る
SELECT LENGTH(title) FROM articles;
# +---------------+
# | LENGTH(title) |
# +---------------+
# | NULL |
# | 0 |
# | 1 |
# | 1 |
# | 1 |
# +---------------+
# title が空のデータを検索する
SELECT * FROM articles WHERE title = '' OR title IS NULL;
SELECT * FROM articles WHERE NULLIF(title, '') IS NULL; # NULLIF() で空文字を NULL にする
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 1 | NULL | NULL |
# | 2 | | NULL |
# +----+-------+-------+
# LIKE で検索。NULL はヒットしない
SELECT * FROM articles WHERE title LIKE '%';
# +----+-------+-------+
# | id | title | value |
# +----+-------+-------+
# | 2 | | NULL |
# | 3 | A | NULL |
# | 4 | B | 0 |
# | 5 | C | 1 |
# +----+-------+-------+
# NULL と CONCAT した場合は、NULL になる
SELECT CONCAT(title, '***') FROM articles;
# +----------------------+
# | CONCAT(title, '***') |
# +----------------------+
# | NULL |
# | *** |
# | A*** |
# | B*** |
# | C*** |
# +----------------------+
# SUM() で合計の取得。NULL は無視される
SELECT SUM(value) FROM articles;
# +------------+
# | SUM(value) |
# +------------+
# | 1 |
# +------------+
# COUNT(*) でレコード数の取得。NULL も含まれる
SELECT COUNT(*) FROM articles;
# +----------+
# | COUNT(*) |
# +----------+
# | 5 |
# +----------+
# COUNT(カラム名) でレコード数の取得。指定したカラムが NULL の場合はカウントしない
SELECT COUNT(value) FROM articles;
# +--------------+
# | COUNT(value) |
# +--------------+
# | 2 |
# +--------------+
