【がいぶきー】

外部キー とは?

最終更新:
💡 テーブルをつなぐ「参照パスポート」

ある列や列の組が、参照先の主キーや一意な列の値に対応するようにする仕組み。外部キー制約を設定すると、存在しない参照先を指す値などをDBMSが拒否し、参照整合性を保つ。同じテーブル内を参照する場合もある。

📌 このページのポイント
社員のdept_idが、存在する部署を参照 社員(子) 部署(親) 名前 dept_id id 部署名 田中 D01 佐藤 D02 鈴木 D01 D01 営業 D02 開発 D03 人事 参照 外部キー 主キー dept_id = D03 存在する部署 → 可 dept_id = D99 存在しない → 拒否 外部キー制約を設定した場合の例 NULLを禁止するにはNOT NULLも必要
dept_idに外部キー制約を設定する例。矢印は最初の2人の参照を示し、鈴木もD01を参照します。参照先は主キーに限らず一意な列も使え、削除時の動作は設定によります。
ひよこ ひよこ
外部キーって何のためにあるの?
ペンギン先生 ペンギン先生
たとえば注文テーブルのuser_idで、利用者テーブルのIDを参照するんだ。外部キー制約を設定すれば、存在する利用者を指しているかデータベースが確認するよ。参照先は主キーだけとは限らず、一意な列の組を使うこともあるんだ。
ひよこ ひよこ
それって単純に数字を入れるのとどう違うの?
ペンギン先生 ペンギン先生
user_idという列名を付けただけでは、外部キー制約にはならないよ。制約を設定して初めて、存在しない利用者IDを指定するなどの違反をデータベースに検査させられる。利用者ID=999が存在しなければ、その参照は拒否されるんだ。
ひよこ ひよこ
空欄の注文も防げる?
ペンギン先生 ペンギン先生
外部キー制約だけではNULLを許せる場合があるよ。利用者の指定を必須にするならNOT NULLも設定するんだ。また、外部キーは複数の列をまとめて定義できるし、従業員テーブルの上司IDのように同じテーブル内の別の行を参照することもできるよ。
ひよこ ひよこ
ユーザーを削除したら注文はどうなるの?
ペンギン先生 ペンギン先生
制約の設定によるよ。ON DELETE CASCADEなら参照する注文も削除され、RESTRICTなら参照されている利用者の削除を拒否する。SET NULLという選択肢もあるけれど、NULL禁止などほかの制約には従う必要があるんだ。
ひよこ ひよこ
じゃあCASCADEにすれば楽じゃない?
ペンギン先生 ペンギン先生
親と一緒に消えるべきデータなら便利だけれど、残す必要がある注文履歴まで消してよいとは限らないよ。データの意味と保存の要件に合わせて選ぼう。外部キー制約は参照整合性を守る仕組みで、どのデータを消すべきかまで決めてくれるわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「外部キー」って出てきたら「参照先の行と対応付け、存在しない参照を防ぐためのキー」と思えばだいたいOK!
📖 おまけ:英語の意味
「Foreign Key」 = 外部のキー
💬 Foreignは外部の、Keyはキー。典型的には別のテーブルのキーを参照するけれど、同じテーブル内の別の行を参照する外部キーもあるよ。

参考資料

← 用語集にもどる