データベース基本概念

外部キー がいぶきー

リレーショナルデータベース参照整合性主キーテーブル結合制約正規化
外部キーについて教えて

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

外部キーは「別のテーブルとの橋渡し役」だよ!たとえば「注文テーブル」に「顧客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)別テーブルの主キーを参照する✅ 可✅ 可(省略可能な関連)
customers(親テーブル) 🔑 customer_id(主キー) name email phone orders(子テーブル) 🔑 order_id(主キー) 🔗 customer_id(外部キー) order_date total_amount status REFERENCES ポイント 子テーブル(orders)の外部キーは、親テーブル(customers)の主キーと同じ値しか持てない

関連する規格・RFC

規格番号内容
ISO/IEC 9075(SQL規格)外部キー制約(FOREIGN KEY / REFERENCES)を含むSQL言語の国際標準。SQL-92以降に正式定義

関連用語

  • 主キー — テーブル内のレコードを一意に識別するための列。外部キーが参照する対象
  • 正規化 — データの重複を排除してテーブルを分割する設計手法。外部キーはその結果として生まれる
  • テーブル結合(JOIN) — 外部キーを使って複数テーブルのデータを横断的に取得するSQL操作
  • 参照整合性 — 外部キーによって保証される「参照先が必ず存在する」というデータの一貫性ルール
  • リレーショナルデータベース — テーブルとキーの関係を基本構造とするデータベースの種類
  • インデックス — 外部キー列に設定することでJOINの検索速度を向上させるデータ構造
  • トランザクション — 外部キー制約のチェックが行われるデータ操作のひとまとまり