データ型

列挙型(ENUM) れっきょがた(いーなむ)

ENUM列挙型定数選択肢データベース状態管理
列挙型(ENUM)について教えて

簡単に言うとこんな感じ!

列挙型(ENUM)は「選択肢をあらかじめ決めたラジオボタン」みたいなデータ型だよ!「注文状態」なら「受付中・処理中・発送済・完了」の4択だけOK、それ以外は入力できない!って決められるから、変なデータが入り込む心配がないんだ。


列挙型(ENUM)とは

列挙型(ENUM:Enumeration Type) とは、カラムに入れられる値を「あらかじめ定義した選択肢の中のどれか」に限定するデータ型です。たとえば status カラムを ENUM('pending', 'processing', 'shipped', 'completed') と定義すれば、この4つの値しか格納できなくなります。

「注文ステータス」「性別」「会員ランク」「曜日」など、取りうる値が有限かつ固定的なデータ に使うと非常に相性がよいです。文字列型で保存すると「配送済み」「発送済み」「ship済」など表記ゆれが発生しがちですが、ENUMで定義すれば自動的に統一できます。

ただし、選択肢を後から追加・変更するには ALTER TABLE 文でスキーマを変更する必要があり、稼働中のシステムでは手間とリスクが伴います。選択肢が増えやすい項目には、ENUMの代わりに別テーブル(コードマスタ・参照テーブル)を使う設計が推奨される場合もあります。


各DBMSでのENUMサポート

DBMSENUM対応実装方法注意点
MySQLネイティブ対応ENUM('a','b','c')内部的には整数インデックスで保存。追加は最後尾なら速い
PostgreSQLカスタム型として対応CREATE TYPE mood AS ENUM (...)型として定義・再利用できる
SQL Server非対応CHECK 制約で代替CHECK (status IN ('a','b','c'))
SQLite非対応CHECK 制約で代替型が緩いため制約で縛る
Oracle非対応CHECK 制約または参照テーブル参照テーブル方式が推奨
-- MySQLでのENUM定義
CREATE TABLE orders (
  id     INT PRIMARY KEY,
  status ENUM('pending', 'processing', 'shipped', 'completed') NOT NULL DEFAULT 'pending'
);

-- PostgreSQLでの列挙型定義
CREATE TYPE order_status AS ENUM ('pending', 'processing', 'shipped', 'completed');
CREATE TABLE orders (
  id     SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'pending'
);

-- 値の追加(PostgreSQL)
ALTER TYPE order_status ADD VALUE 'cancelled';

歴史と背景

  • 1970年代 — Pascal言語が列挙型を採用。「type Season = (Spring, Summer, Autumn, Winter)」のように人間が読める定数の集合として導入
  • 1983年C言語enum が ANSI C で標準化。整数の集合に名前を付ける形で普及
  • 1990年代JavaC# などのオブジェクト指向言語が列挙型を採用。定数管理の標準手法に
  • MySQL 3.23 — RDBMSとしていち早く ENUM 型を実装。文字列の選択肢を整数で内部管理する方式
  • PostgreSQL 8.3(2008年)CREATE TYPE ... AS ENUM で型として定義できる仕組みを追加。MySQLより柔軟な実装に
  • 現在マイクロサービス・APIファースト設計では「DBのENUMを使わず、アプリ層で列挙値を管理する」設計も増えている

ENUM vs 参照テーブル方式の比較

「注文ステータス」の管理アプローチ比較 ENUM型で管理 ordersテーブル status ENUM('pending', 'processing','shipped',...) ✅ シンプルで直感的 ✅ JOIN不要 ❌ 選択肢変更にALTER必要 ❌ 表示名の変更が面倒 ❌ 移植性が低い 参照テーブル方式 order_statusesテーブル code | label | sort_order pending | 受付中 | 1 shipped | 発送済 | 3 ✅ 選択肢をSQLで追加可能 ✅ 表示名・順序も管理可能 ✅ 移植性が高い ❌ テーブルが増える・JOINが必要

関連する規格・RFC

規格・RFC番号内容
ISO/IEC 9075 (SQL標準)SQL標準にENUM型の定義は含まれないが、CHECK 制約による同等実装は規定

関連用語

  • 真偽値型(Boolean) — 「2択しかない」ENUM の特殊ケースとも言える型
  • 文字列型 — ENUMの代わりに選択値を文字列で保存する際の基本型
  • 制約 — SQL ServerやSQLiteでENUMの代わりに使う CHECK 制約
  • 外部キー — 参照テーブル方式でステータスを管理する場合に使う仕組み
  • インデックス — ENUMカラムにインデックスを設定して検索を高速化する
  • スキーマ — ENUMの変更はスキーマ変更を伴う点が重要
  • NULL — ENUMカラムにNULLを許可するかどうかは設計判断のポイント