制約 せいやく
簡単に言うとこんな感じ!
データベースに「変なデータを入れないで!」と見張り番を置く仕組みだよ。たとえば「年齢はマイナスにできない」「メールアドレスは重複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つのテーブル間の「参照関係」を保証します。
上図のように、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以降に整備 |