9cubed
ブログ | Tailwind | Vite | Python | MariaDB | Node.js | Linux | PowerShell | Docker | Git | その他 | 将棋ウォーズ | 歌の練習
< 前の記事

外部キー制約

次の記事 >

インデックス

MariaDB

[MariaDB]NOT NULL 制約と NULL を許容した時の動作

公開日: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 を許容することを検討してください。

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 null

3. 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 |
#  +--------------+
< 前の記事

外部キー制約

次の記事 >

インデックス

YouTube X

新着一覧

  • テーブル結合(CROSS JOIN、INNER JOIN、LEFT JOIN)MariaDB
  • 楽観ロック・悲観ロックMariaDB
  • カレントリードMariaDB
  • インデックスMariaDB
  • 論理削除(ソフトデリート)MariaDB
  • awk(オーク)の使い方についてLinux
  • NOT NULL 制約と NULL を許容した時の動作MariaDB
  • 外部キー制約MariaDB
  • MySQL と MariaDB の関係MariaDB
  • Docker で PostgreSQL のコンテナの使用Linux

アーカイブ

  • 2026/01
  • 2025/12
  • 2025/11
  • 2025/10
  • 2025/09
  • 2025/08
  • /00

以前のカテゴリー一覧

  • CakePHP3
  • CentOS7
  • HTML・CSS・JavaScript
  • Haskell
  • JavaScript
  • Kotlin
  • Laravel5
  • PHP
  • Python
  • Ruby
  • RubyOnRails5
  • TypeScript
  • Vue.js
  • Webサーバ講座
  • Webプログラミング講座
  • jQuery
  • linux
  • パソコン講座
  • ブログ
  • プログラミング講座
  • メモ帳作成講座
  • 数学

Copyright © 9cubed. All Rights Reserved.

プライバシーポリシー 利用規約
▲