外部キー がいぶきー
簡単に言うとこんな感じ!
外部キーは「別のテーブルとの橋渡し役」だよ!たとえば「注文テーブル」に「顧客ID」を書いておくと、その番号をたどって「顧客テーブル」の詳細情報を引き出せる。存在しない顧客の注文が入らないようにガードしてくれる番人でもあるんだ!
外部キーとは
外部キー(Foreign Key、FK) とは、あるテーブルの列(カラム)が、別のテーブルの主キー(Primary Key) を参照するように設定された仕組みです。「このデータはあのテーブルのどのレコードと紐づいているか」を明示するためのポインター(指し示す値)として機能します。
外部キーの最大の役割は 参照整合性(Referential Integrity) の保証です。たとえば「存在しない顧客IDを持つ注文レコード」や「まだ注文に紐づいている顧客を誤って削除する」といった矛盾したデータが登録されないよう、データベースエンジンが自動的にチェックしてくれます。これにより、手動チェックに頼らず確実なデータの一貫性が維持されます。
ビジネスの現場では、顧客・商品・注文・社員など複数のテーブルを外部キーで関連づけ、必要なときにテーブルを結合(JOIN) して情報を取り出す設計が標準的です。外部キーを正しく設計することは、データベースの品質と保守性を左右する重要な作業です。
外部キーの構造と動き
外部キーは「子テーブル(参照する側)」と「親テーブル(参照される側)」の2つのテーブルの関係で成り立ちます。
| 役割 | テーブル例 | キーの種類 |
|---|---|---|
| 親テーブル(参照される側) | 顧客テーブル(customers) | 主キー(customer_id) |
| 子テーブル(参照する側) | 注文テーブル(orders) | 外部キー(customer_id) |
【親テーブル】 customers
+-------------+----------+
| customer_id | name |
+-------------+----------+
| 1 | 山田 太郎 |
| 2 | 鈴木 花子 |
+-------------+----------+
↑ 主キー
【子テーブル】 orders
+----------+-------------+-------+
| order_id | customer_id | total |
+----------+-------------+-------+
| 1001 | 1 | 5,000 | ← customer_id=1 → 山田 太郎
| 1002 | 2 | 3,200 | ← customer_id=2 → 鈴木 花子
| 1003 | 9 | 900 | ← ❌ 存在しないのでエラー!
+----------+-------------+-------+
↑ 外部キー(customers.customer_id を参照)
覚え方:「住所録と手紙」
外部キーは「手紙(注文)に書いてある宛先番号(customer_id)が、住所録(顧客テーブル)に必ず載っていなければいけない」仕組みと同じ。番号をでたらめに書いた手紙は受け付けてもらえない! と覚えよう。
外部キー制約の主なオプション
外部キーには「親データを削除・更新したとき、子データをどうするか」を指定するオプションがあります。
| オプション | 動作 | 使いどころ |
|---|---|---|
RESTRICT(デフォルト) | 親の削除・更新をエラーで拒否 | 誤削除防止を最優先したいとき |
CASCADE | 親の削除・更新に合わせて子も自動変更 | 注文明細など親に従属するデータ |
SET NULL | 親が消えたら子の外部キー列をNULLに | 任意の関連付け(担当者が退職した案件など) |
NO ACTION | トランザクション完了時にチェック | 一時的な整合性崩れを許容したいとき |
歴史と背景
- 1970年代 — E.F.コッドがリレーショナルデータベースの理論を発表。テーブル間の関係(リレーション)という概念が生まれ、外部キーの基礎が確立される。
- 1980年代 — OracleやDB2などの商用RDBMSが登場し、外部キー制約が実装されてビジネス利用が拡大。
- 1992年 — SQL-92(SQL規格の改訂版)で外部キー制約が標準仕様として正式に定義される。
REFERENCES句やON DELETE CASCADEなどの文法が規格化。 - 1990年代〜2000年代 — MySQLが普及するが、当初は主要ストレージエンジン「MyISAM」が外部キーをサポートせず。後継の「InnoDB」で正式サポートが広まる。
- 2010年代以降 — NoSQLデータベースの台頭により「外部キーを持たない設計」も一般化。一方、PostgreSQLなどはより高度な外部キー機能を拡充し、RDBMSの信頼性の核として再評価される。
主キー・一意キーとの比較と関係図
外部キーを理解するには、主キー(Primary Key) と 一意キー(Unique Key) との違いを整理することが重要です。
| キーの種類 | 目的 | 重複 | NULL |
|---|---|---|---|
| 主キー(PK) | レコードを唯一に識別する | ❌ 不可 | ❌ 不可 |
| 一意キー(UK) | 列の値の重複を禁止する | ❌ 不可 | ✅ 可(一部) |
| 外部キー(FK) | 別テーブルの主キーを参照する | ✅ 可 | ✅ 可(省略可能な関連) |
関連する規格・RFC
| 規格番号 | 内容 |
|---|---|
| ISO/IEC 9075(SQL規格) | 外部キー制約(FOREIGN KEY / REFERENCES)を含むSQL言語の国際標準。SQL-92以降に正式定義 |
関連用語
- 主キー — テーブル内のレコードを一意に識別するための列。外部キーが参照する対象
- 正規化 — データの重複を排除してテーブルを分割する設計手法。外部キーはその結果として生まれる
- テーブル結合(JOIN) — 外部キーを使って複数テーブルのデータを横断的に取得するSQL操作
- 参照整合性 — 外部キーによって保証される「参照先が必ず存在する」というデータの一貫性ルール
- リレーショナルデータベース — テーブルとキーの関係を基本構造とするデータベースの種類
- インデックス — 外部キー列に設定することでJOINの検索速度を向上させるデータ構造
- トランザクション — 外部キー制約のチェックが行われるデータ操作のひとまとまり