外部キーとは
外部キーとは、関係データベース(RDB)において、あるテーブルの項目(列)が、別の関連するテーブルの「主キー」を参照している場合の項目のことです。これにより、テーブルとテーブルの間に正しい親子関係や繋がりを作ることができます。外部キーには「参照制約」というルールが適用され、親側のテーブルに存在しない値は、子側のテーブルの外部キー列に登録できないようにシステムで厳しく制限され、データの品質を維持します。
具体例
注文を管理する「注文テーブル」と、顧客の情報を管理する「顧客テーブル」があります。注文テーブルの中に『顧客ID』という項目を作り、これを外部キーとして設定して顧客テーブルの主キー(顧客ID)を参照させます。もし顧客登録されていない架空の顧客(例えばID: 9999)が注文しようとしても、参照制約が働くためデータベースは登録をエラーにして拒否します。これにより、実体のない幽霊注文が生まれるのを防ぐことができます。
もう少し詳しく
外部キー(Foreign Key)は、リレーショナルデータベースにおける最大の強みである「データ同士の関連付け」と、その関連に矛盾が生じないようにする「参照整合性制約(参照制約)」を担保するための必須機能です。外部キーを設定した列は、必ず親となるテーブルの「主キー」または「一意キー(重複のない列)」の値を参照しなければなりません。
外部キーを使用する際、親テーブルのデータが削除されたり更新されたりした場合に、子テーブルの関連データをどのように処理するか(連動オプション)をデータベース設計で定義します。代表的なアクションは以下の通りです。
1. カスケード(CASCADE):親テーブルのデータが削除・更新された場合、子テーブルの対応するデータも「連動して削除・更新」されます。例えば、顧客のアカウントを削除したときに、その顧客のすべての注文履歴も自動で一緒に削除されるような動作です。
2. 制限(RESTRICT / NO ACTION):親テーブルのデータを削除・更新しようとした際、子テーブルに関連するデータが1件でも存在する場合は、親データの削除・更新操作そのものを「データベースがエラーにして拒否」します。注文履歴がある顧客は削除できないように制限する場合に適用します。
3. ヌル設定(SET NULL):親テーブルのデータが削除・更新された場合、子テーブルの外部キー列の値を「空値(NULL)」に書き換えます。顧客が削除されても、注文履歴データ自体は残し、顧客IDの欄だけを空にしたい場合に用います。
外部キーを適切に設定し、これらの挙動をコントロールすることで、システムが稼働した後にデータが破損したり、参照先が存在しない孤立データ(迷子データ)が発生したりするのを防ぐことができます。
試験でのポイント
IT試験においては、「参照制約」という言葉の定義や、外部キーと参照整合性の関係性を問う問題が多く出題されます。
試験対策としての重要ポイントは以下の通りです。
・他のテーブルの主キーを参照する:「外部キーは、関連する他のテーブルの主キー(または候補キー)を参照する列である」という特徴を押さえましょう。
・参照制約違反のシチュエーション:親テーブルに登録されていない値を子テーブルの外部キーに登録しようとした場合や、子テーブルから参照されている親テーブルの行を不用意に削除しようとした場合に、参照制約エラーが発生することを論理的に理解しておきましょう。
・CASCADEの挙動:CASCADE(連鎖)が選択されている場合、親テーブルの削除が子テーブルにどう波及するかを正確に把握しておく必要があります。
「ある表の列が、別の表の主キーを参照しているとき、その列を何と呼ぶか」または「データ間に矛盾が生じないように参照整合性を維持する制約はどれか」という問いに対して、外部キーや参照制約を選べるようにしておきましょう。
関連する用語
外部キーの参照先となる「主キー(プライマリキー)」や、外部キーがデータ整合性を保つためのルールである「参照制約(参照整合性制約)」が最重要の関連用語です。また、親データの削除時に子データを連動させる「カスケード(CASCADE)」や、外部キーを定義してテーブル同士を論理的に結びつける「関係データベース(RDB)」も深く関連しています。