他の表の主キーを参照して表同士を関連づける列。
外部キー(フォーリンキー)とは、他の表の主キーを参照して、表同士を関連づける列です。主キーが「自分の表の行を識別する列」なのに対し、外部キーは「別の表の行を指し示す列」だと考えると分かりやすいです。
身近な例で考えると、本に付いている著者番号に似ています。「本の一覧表」に著者番号を1つ書いておけば、「著者の一覧表」のどの著者かをたどれます。社員表に「部署番号」を書いておくと、部署表のどの部署に所属しているかが分かる、という仕組みです。
上の図解では、社員表の「部署番号」(外部キー)が、部署表の「部署番号」(主キー)を指し示しています。こうして同じ値を橋渡しに使うことで、別々の表に分けたデータを結びつけられます。1つの表に外部キーは複数あってもかまいません。
外部キーには参照整合性という大切な働きがあります。これは、外部キーの値が必ず参照先の主キーに存在することを保証する仕組みです。
データベースは外部キー制約により、次のような矛盾したデータを防ぎます。
・存在しない部署番号の社員は登録できない(参照先にない値を拒否)
・社員がまだ所属する部署を、不用意に削除できない
こうして「どこにも所属していない社員」のような宙に浮いたデータが生まれないようにします。
身近な例で考えると、住所録と地名の関係に似ています。住所録に「存在しない市町村名」を書けないようにしておけば、配達できない住所が混ざらずに済みます。参照整合性は、表同士のつながりが常に正しい状態を保つための「番人」のような役割です。
外部キーで参照されている行を削除しようとしたとき、データベースは「宙に浮いたデータ」が生まれないよう保護します。この動作のことを「ON DELETE アクション」といい、設定によって動きが変わります。
主な3パターンを覚えておくと便利です。
・RESTRICT(制限):参照している行が存在する限り、削除を拒否してエラーにします。最も安全。
・CASCADE(連鎖):参照元の行を自動的に一緒に削除します。親の部署が消えたら、その部署の社員も全員削除されます。
・SET NULL(NULL置換):参照先が消えたら、外部キー列を空(NULL)に置き換えます。社員は残るが所属部署が「未設定」になります。
なぜこの動作を知っておくのか。外部キーの制約はデータを守るためのものですが、「削除できなくてエラー」「間違えて大量削除」といった問題も引き起こしえます。どのアクションが設定されているかを理解しておくことが、データを正しく扱うための第一歩です。
| 主キー(PK) | 外部キー(FK) | |
|---|---|---|
| 役割 | 自分の表の行を一意に識別する | 別の表の行を指し示して関連づける |
| 表の数 | 1つの表に1つだけ | 1つの表に複数あってもよい |
| NULL | 禁止(必ず値が必要) | 許可される(場合による) |
| 重複 | 禁止(必ず一意) | 許可(同じ値が複数行にあってよい) |
| 具体例 | 社員表の「社員番号」 | 社員表の「部署番号」(部署表を参照) |
主キーと外部キーは名前が似ていて混同しやすいですが、役割がまったく異なります。
主キーは「自分の表の番号札」です。クラスの出席番号のように、その表の中で行を区別するためだけの番号で、空も重複も許されません。
外部キーは「別の表への案内板」です。社員表の「部署番号」列は、部署表を指し示すための値を持ちます。同じ部署に複数の社員がいるので値の重複は普通にあります(D01が101・103の両方に入る)。また、所属部署が未定の社員がいれば NULL も許容されます。
2つのキーを組み合わせることで、データを別々の表に整理しつつ、必要なときにつなぎ直せる関係データベースの仕組みが成立します。
外部キーは、データを複数の表に分けて整理しつつ、必要なときに結びつけるために使います。1つの表にすべてを詰め込むと、同じ情報が何度も繰り返し書かれてしまうからです。
外部キーがもたらす主な利点は次のとおりです。
・重複を防ぐ:部署名や顧客名を1か所にまとめ、ほかの表は番号で参照する
・変更が楽になる:部署名が変わっても、部署表の1行を直すだけで済む
・関連をたどれる:社員 → 部署、注文 → 顧客のように表をつないで検索できる
身近な例で考えると、レシートと商品マスタの関係に似ています。レシートには商品名をそのまま書かず「商品コード」だけを書いておき、商品名や価格は別の一覧(商品マスタ)で管理します。こうしておけば価格改定のときも、マスタを1か所直すだけで全レシートに反映できる、というイメージです。