データベース基本概念

制約 せいやく

PRIMARY KEYFOREIGN KEYNOT NULLUNIQUECHECK制約整合性
制約について教えて

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

データベースに「変なデータを入れないで!」と見張り番を置く仕組みだよ。たとえば「年齢はマイナスにできない」「メールアドレスは重複NG」みたいなルールをDB側が自動でチェックしてくれるんだ。アプリのバグでおかしなデータが入り込もうとしても、制約がブロックしてくれるってこと!


制約とは

制約(Constraint)とは、データベースのテーブルに保存できるデータの内容や形式に対して設けるルールのことです。「空欄禁止」「重複禁止」「他のテーブルに存在する値だけ許可」といった条件を、テーブルの定義レベルで設定しておくことができます。

制約はアプリケーション側のプログラムに頼らず、データベースエンジン自体がルール違反を検出して拒否する点が最大の特徴です。どんなシステムからデータを書き込もうとしても、制約に引っかかった操作は自動的に失敗します。これにより、データの整合性(Integrity)=「データが矛盾なく正しい状態を保つこと」が保証されます。

実務上は「制約はデータの品質を守る最後の砦」と表現されます。業務システムを発注・設計する際、「どんな制約をDBに設けるか」は設計品質に直結する重要な意思決定です。


制約の種類と役割

代表的な制約を整理すると以下のようになります。

制約名意味
PRIMARY KEY主キー行を一意に識別する列。重複・NULL不可顧客ID、注文番号
UNIQUE(一意制約)列内の値が重複してはいけないメールアドレス、社員番号
NOT NULL(非NULL制約)その列を空欄(NULL)にしてはいけない氏名、登録日時
FOREIGN KEY外部キー別テーブルに存在する値しか入れられない注文テーブルの「顧客ID」
CHECK(チェック制約)任意の条件式でOK/NGを判定する年齢 >= 0、ステータス IN (‘active’,‘inactive’)
DEFAULT(デフォルト制約)値が指定されなかった場合の初期値を設定登録日時 = CURRENT_TIMESTAMP

覚え方:「主一外チェック黙認」

  • キー(PRIMARY KEY)
  • 意(UNIQUE)
  • 部キー(FOREIGN KEY)
  • チェック(CHECK)
  • NOT NULLとDEFAULTは「黙認しない・める値を決める」

この6種類がRDB(リレーショナルデータベース)制約の基本セットです。

NULL とは

NULL(ヌル)は「値が存在しない・不明」を意味する特殊な状態です。0でも空文字でもなく「何もわからない」という概念で、NOT NULL制約はこのNULLの混入を防ぎます。


歴史と背景

  • 1970年 — E.F.コッドがリレーショナルモデルを提唱。「関係整合性」の概念が登場し、制約の理論的基盤が生まれる
  • 1974年頃 — IBMがSQL原型となるSEQUEL言語を開発。制約の概念が実装され始める
  • 1986年 — ISO/IEC 9075としてSQL-86が標準化。PRIMARY KEYとFOREIGN KEYが正式仕様に
  • 1992年 — SQL-92でCHECK制約・NOT NULL・UNIQUEが整備され、現在の制約体系がほぼ確立
  • 2000年代以降NoSQLの台頭でスキーマレスDBが普及するが、整合性を保証するために制約の重要性が再評価される
  • 現在 — PostgreSQL・MySQL・Oracle・SQL Serverいずれも制約を標準サポート。クラウドDBでも同様に使われている

制約の構造とFOREIGN KEYの仕組み

制約の中でもとくに理解が必要なのが FOREIGN KEY(外部キー制約) です。2つのテーブル間の「参照関係」を保証します。

顧客テーブル(customers) customer_id ← PRIMARY KEY name NOT NULL email UNIQUE / NOT NULL age CHECK(age >= 0) 注文テーブル(orders) order_id ← PRIMARY KEY customer_id ← FOREIGN KEY ordered_at NOT NULL amount CHECK(amount > 0) 参照 orders.customer_id は customers.customer_id に存在する値のみ許可

上図のように、ordersテーブルのcustomer_id列にFOREIGN KEYを設定すると、customersテーブルに存在しない顧客IDを持つ注文レコードは登録できなくなります。「存在しない顧客の注文」という矛盾したデータを防げるわけです。

制約違反時の動作(FOREIGN KEY)

アクション内容
RESTRICT参照先の削除・更新を禁止(デフォルト)
CASCADE参照先が削除されると子レコードも自動削除
SET NULL参照先が削除されると外部キーをNULLに設定
NO ACTIONトランザクション終了時に整合性チェック

関連する規格・RFC

規格番号内容
ISO/IEC 9075(SQL標準)PRIMARY KEY・FOREIGN KEY・CHECK・UNIQUE・NOT NULLの各制約を規定するSQL国際標準。SQL-92以降に整備

関連用語

  • 主キー — テーブルの各行を一意に識別する列または列の組み合わせ
  • 外部キー — 別テーブルの主キーを参照し、テーブル間の整合性を保つ列
  • NULL — 「値が存在しない・不明」を表すデータベース固有の特殊状態
  • テーブル — データを行と列で管理するリレーショナルDBの基本単位
  • 正規化 — データの重複・矛盾を減らすためのテーブル設計手法
  • トランザクション — 複数の操作をひとまとまりとして扱い、整合性を保つ仕組み
  • インデックス — 検索を高速化するためにDBが保持する索引構造
  • DDL — CREATE TABLE など、テーブル定義や制約を記述するSQL命令群