9cubed
ブログ | PHP | JavaScript | TypeScript | Vue.js | Laravel | Tailwind | Vite | Python | MariaDB | SQLite | Node.js | Linux | PowerShell | Docker | Git | Web | その他
< 前の記事

外部キー制約

次の記事 >

インデックス

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

新着一覧

  • async、awaitJavaScript
  • Promise についてJavaScript
  • パッケージの管理Node.js
  • v-model(双方向バインディング)Vue.js
  • VS Code で GitHub を使ったソース管理Git
  • computed(再計算)Vue.js
  • watchDebounced(値の監視)Vue.js
  • watch(値の監視)Vue.js
  • change イベントVue.js
  • v-memoVue.js

アーカイブ

  • 2026/03
  • 2026/02
  • 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.

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