外部キー(ガイブキー)とは | 意味や読み方など丁寧でわかりやすい用語解説
外部キー(ガイブキー)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
外部キー (ガイブキー)
英語表記
foreign key (フォリンキー)
用語解説
外部キーは、リレーショナルデータベースにおいて、テーブル間の関連性を定義し、データの整合性を保証するために用いられる重要な制約の一つである。外部キーを理解することは、データベースの正しい設計と運用に不可欠である。その役割は、あるテーブルの特定の列の値を、別のテーブルの特定の列に存在する値に限定することにある。これにより、テーブル同士が意味のある形で結びつき、矛盾したデータが登録されるのを防ぐ。例えば、「顧客テーブル」と「注文テーブル」が存在する場合を考える。「顧客テーブル」には各顧客を一意に識別するための「顧客ID」という主キーが存在する。一方、「注文テーブル」には、どの顧客からの注文なのかを記録するために「顧客ID」列が設けられる。この「注文テーブル」の「顧客ID」列が外部キーとして設定される。この設定により、「注文テーブル」の「顧客ID」列には、「顧客テーブル」に実際に存在する「顧客ID」の値しか入力できなくなる。つまり、存在しない顧客からの注文データが誤って作成されることをデータベースのレベルで防ぐことができる。外部キーが参照する先の列は、通常、参照先テーブルの主キーであるが、一意性制約が設定された列(ユニークキー)を参照することも可能である。外部キーを持つテーブルを「子テーブル」、参照される側のテーブルを「親テーブル」と呼ぶ。先の例では、「注文テーブル」が子テーブル、「顧客テーブル」が親テーブルとなる。
外部キーの最も重要な機能は「参照整合性制約」の強制である。参照整合性とは、関連付けられたテーブル間でデータの一貫性が保たれている状態を指す。この制約は、データの追加、更新、削除といった操作に対して機能する。まず、子テーブルへのデータの挿入または更新時、外部キー列に指定された値が親テーブルの対応する主キー列に存在しない場合、その操作はエラーとなり拒否される。これにより、親子関係が成り立たない不正なデータが子テーブルに登録されるのを防ぐ。ただし、外部キー列にNULL(値なし)を許容する設定になっている場合は、NULL値を登録することは可能である。これは、関連先の親データが未定である状態を表現する場合などに利用される。次に、親テーブルのデータに対する更新や削除操作にも制約がかかる。子テーブルから参照されている親テーブルの行(レコード)を削除しようとしたり、主キーの値を変更しようとしたりすると、その操作はデフォルトでは失敗する。これは、親データを失うことで、子データがどの親データを参照していたのか分からなくなる「孤児レコード」の発生を防ぐためである。
この親テーブルでの更新・削除時の動作は、外部キー制約を設定する際に「参照アクション」として詳細に定義することができる。代表的な参照アクションにはいくつかの種類がある。最も一般的なのは「RESTRICT」または「NO ACTION」であり、子テーブルに参照されている行が存在する限り、親テーブルの該当行の更新・削除を許可しない。これはデータの安全性を最も高く保つ設定である。「CASCADE」は、親テーブルの行が削除された場合に、その行を参照している子テーブルの全ての行も自動的に削除する。親テーブルの主キーが更新された場合は、子テーブルの外部キー値も追随して更新される。例えば、顧客が退会して顧客データが削除された際に、その顧客に関連する注文履歴も全て自動で削除したい場合に用いる。「SET NULL」は、親テーブルの行が削除または更新された場合に、子テーブルの外部キー列の値をNULLに設定する。このアクションを利用するには、外部キー列がNULL値を許容するように定義されている必要がある。例えば、商品の担当者が退職した場合に、商品データ上の担当者IDを一時的に空にするといった用途で使われる。「SET DEFAULT」は、親テーブルの行が削除または更新されると、子テーブルの外部キー列の値をあらかじめ定義されたデフォルト値に設定するものである。
外部キーはデータの整合性を保つ一方で、パフォーマンスにも影響を与える。データの挿入、更新、削除のたびに参照整合性のチェック処理が実行されるため、わずかながら処理コストが増加する。しかし、このコストはデータの信頼性を確保するための必要不可欠な対価である。むしろ、外部キー列にはインデックスを作成することが強く推奨される。インデックスがあれば、参照先の親テーブルに該当する値が存在するかどうかのチェックが高速になり、制約によるパフォーマンス低下を最小限に抑えることができる。さらに、インデックスはテーブル結合(JOIN)処理の性能を大幅に向上させるため、結果的にシステム全体のパフォーマンス向上に寄与することが多い。データベース管理システムによっては、外部キー制約を作成すると自動的に対応するインデックスが作成されるものもある。外部キーには、同じテーブル内の別の行を参照する「自己参照外部キー」という特殊な使い方もある。例えば、従業員テーブルにおいて、各従業員の「上司ID」列が、同じ従業員テーブルの「従業員ID」列を参照するようなケースである。これにより、テーブル一つで組織の階層構造などを表現することが可能になる。このように、外部キーは単なるテーブル間の関連を示す目印ではなく、データベースシステムにデータの整合性を能動的に保護させるための強力な仕組みである。アプリケーション側のロジックだけで整合性を担保しようとすると、プログラムのバグや予期せぬ操作によって容易にデータ矛盾が発生する可能性がある。外部キーは、データベース設計の根幹をなし、堅牢で信頼性の高いシステムを構築するための基礎となる概念である。