情報処理試験を勉強していると、「外部キーって結局何のためにあるの?主キーとどう違うの?」と混乱しがちです。
外部キーは関係データベースにおいてテーブル間をつなぐ「橋」の役割を果たし、データの整合性を守る制約の中心です。この記事では、その仕組みと試験での問われ方をまとめます。
対象試験と出題頻度
外部キー(Foreign Key)は、基本情報技術者・応用情報技術者で出題されるテーマです。
「外部キーの定義を選ばせる問題」や「参照制約によって拒否される操作を判断する問題」が定番化しており、主キーとの役割の違いを正確に区別できるかが問われます。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
外部キー(Foreign Key)とは、一言で言うと
「他の表の主キー(候補キー)を参照する列で、表と表を関連付ける役割を持つもの」
です。
イメージとしては、「図書カードに書かれた「著者番号」」です。
図書館で本のカードを見ると「著者番号:A012」のような記載があります。
この番号だけでは著者の名前は分かりませんが、著者名簿で「A012」を引けば「夏目漱石」と分かります。著者番号は著者名簿の管理番号(主キー)を借りてきたもので、これが外部キーの構造です。
📊 外部キーの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Foreign Key(FK) |
| 分類 | 関係データベースの整合性制約(参照制約) |
| SQL構文 | FOREIGN KEY (列名) REFERENCES 親テーブル(列名) |
| 対になる概念 | 主キー(Primary Key) |
解説
関係データベースでは、データの冗長性を排除するために正規化でテーブルを分割します。分割すると「別のテーブルにあるデータとどう結び付けるか」が問題になります。
この問題を解決するのが外部キーです。
参照先テーブルの主キーの値を参照元テーブルに持たせることで、テーブル間の関連を定義します。
外部キーが保証する「参照制約」
外部キーを設定すると、DBMSは自動的に「参照制約(参照整合性制約)」を適用します。
これは次の2つのルールで成り立っています。
| ルール | 内容 | 具体例 |
|---|---|---|
| 挿入の制限 | 参照先テーブルに存在しない値を外部キー列に挿入できない | 部署テーブルに「D99」がないのに、社員テーブルの部署IDに「D99」を入れるとエラー |
| 削除の制限 | 参照元テーブルから参照されている行を親テーブルから削除できない | 社員テーブルで部署ID「D01」を参照中なら、部署テーブルの「D01」行は削除不可 |
図解:参照制約の仕組み
以下は、注文テーブルの「顧客番号」が顧客テーブルの主キーを参照しているケースです。
どの操作が許可され、どの操作が拒否されるかを確認してください。
参照制約の動作イメージ
顧客テーブル(親)
| 顧客番号 | 氏名 |
|---|---|
| C001 | 田中 |
| C002 | 鈴木 |
| C003 | 佐藤 |
※ 実線下線=主キー
注文テーブル(子)
| 注文番号 | 顧客番号 | 商品名 |
|---|---|---|
| 0001 | C001 | ノートPC |
| 0002 | C002 | マウス |
※ 実線下線=主キー / 破線下線=外部キー
× 拒否される操作
注文テーブルに顧客番号「C999」の行を追加
→ 顧客テーブルにC999が存在しない
顧客テーブルの「C002」行を削除
→ 注文テーブルから参照されている
○ 許可される操作
注文テーブルに顧客番号「C003」の行を追加
→ 顧客テーブルにC003が存在する
注文テーブルの行を削除
→ 子テーブル側の削除は制限されない
SQLでの定義方法
外部キーはCREATE TABLE文の中で定義します。以下は注文テーブルで顧客番号を外部キーに指定する構文例です。
CREATE TABLE 注文 ( 注文番号 CHAR(4) PRIMARY KEY, 顧客番号 CHAR(4), 商品名 VARCHAR(50), FOREIGN KEY (顧客番号) REFERENCES 顧客(顧客番号) );
FOREIGN KEYで参照元の列を、REFERENCESで参照先のテーブルと列を指定します。
この構文で設定される制約が「参照制約」です。
ON DELETE / ON UPDATE の参照動作
参照先の行が削除・更新されたときの振る舞いを、外部キー定義時にオプションで指定できます。
詳細をクリックして確認(何となくで覚えたい人向け)
| 参照動作 | 動作内容 |
|---|---|
| CASCADE | 親の削除・更新に連動して子の行も削除・更新する |
| SET NULL | 親の削除・更新時に子の外部キー列をNULLにする |
| SET DEFAULT | 親の削除・更新時に子の外部キー列をデフォルト値にする |
| RESTRICT / NO ACTION | 子から参照されている親の行は削除・更新を拒否する(デフォルト動作) |
※ AP R1秋 午前問27で「ON DELETE CASCADE」の動作を問う問題が出題されています。
主キー・候補キー・スーパーキーとの違い
「キー」と名の付く用語は複数あり、混同しやすいポイントです。以下で整理します。
| キーの種類 | 役割 | 特徴 |
|---|---|---|
| 主キー | 行を一意に識別する列 | 重複不可・NULL不可。1テーブルに1つ |
| 候補キー | 主キーになり得る列の集合のうち極小のもの | 複数存在しうる。主キーに選ばれなかったものは代理キー |
| スーパーキー | 行を一意に識別できる列の組を含む集合 | 極小でなくてもよい(余分な列を含んでいてもOK) |
| 外部キー | 他の表の候補キーを参照する列 | 値の重複OK・NULLも許容される場合がある |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 外部キーの核心を3行で
・他の表の主キー(候補キー)を参照し、テーブル間の関連を定義する列
・参照制約により「存在しない値の挿入」と「参照されている行の削除」が拒否される
・SQLではFOREIGN KEY … REFERENCES構文で定義する
試験ではこう出る!
外部キーは、FE・APの午前問題でデータベースの整合性制約に関する定番テーマとして繰り返し出題されています。
出題パターンは大きく3つに分かれます。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| AP R5秋 午前 問27 |
関係モデルにおける外部キーの説明として適切なものを選ぶ | ・正解は「ある関係の候補キーを参照する属性、又は属性の組」 ・代理キー・候補キー・スーパーキーの定義がひっかけ |
| FE H29秋 午前 問27 |
FOREIGN KEYとREFERENCESで指定する制約は何か | ・正解は「参照制約」 ・キー制約・検査制約・表明がひっかけ |
| FE H28春 午前 問29 |
外部キーを定義する目的として適切なものを選ぶ | ・正解は「レコード間の参照一貫性が維持される制約をもたせる」 ・同一問題がR4修了試験問21等でも流用 |
| FE H24秋 午前 問31 |
参照の整合性を損なうデータ操作を選ぶ | ・正解は「顧客テーブルに存在しない顧客番号の行を注文テーブルに追加する操作」 ・H22秋問33と同一問題 |
| AP R1秋 午前 問27 |
ON DELETE CASCADEの参照動作を問う | ・親テーブルの行削除時に子テーブルの対応行も自動削除される動作 |
📝 IPA試験での出題パターン
パターン1:「外部キーの定義を選べ」
AP R5秋問27のように、候補キー・スーパーキー・代理キーと紛らわしい選択肢が並ぶ形式。ここだけは確実に押さえてください。「他の関係の候補キーを参照する」が外部キーの本質です。「行を一意に識別」と書いてあったら外部キーではありません。
パターン2:「FOREIGN KEY構文が指定する制約名を答えよ」
FE H29秋問27の形式。SQL構文と制約名の対応を覚えていれば即答できます。FOREIGN KEY+REFERENCES=参照制約、これだけで得点になります。
パターン3:「参照整合性を損なう操作を選べ」
FE H24秋問31のように、具体的な表データを見て「この操作は通るか、拒否されるか」を判断する形式。子テーブルへの挿入と親テーブルからの削除、この2つの方向だけチェックすれば正解にたどり着けます。
試験ではここまででOKです。ON DELETEの参照動作(CASCADE等)はAPレベルで出ることがありますが、FEでは深追い不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 関係データベースにおいて、外部キーを定義する目的として最も適切なものはどれでしょうか?
- A. 表の中で行を一意に識別し、重複データの登録を防止する。
- B. 関係する相互のテーブルにおいて、レコード間の参照一貫性が維持される制約をもたせる。
- C. 列に格納できる値の範囲やデータ型を制限し、不正な値の入力を防ぐ。
正解と解説を見る
正解:B
解説:
外部キーは、他のテーブルの候補キー(主キー)を参照する列であり、テーブル間のレコード参照が常に有効であることを保証する「参照制約」を実現するために定義します。FE H28春 午前問29で同趣旨の出題が確認されています。
選択肢Aは主キー(PRIMARY KEY)の目的です。主キーは行の一意識別が役割であり、参照先との関連付けは外部キーの担当です。選択肢Cは検査制約(CHECK制約)やドメイン制約の目的です。値の範囲や型を制限する仕組みであり、テーブル間の関連を定義する外部キーとは目的が異なります。
よくある質問(FAQ)
Q. 外部キーの値にNULLは入れられますか?
テーブル定義でNOT NULL制約を付けていなければ、外部キー列にNULLを入れることは可能です。例えば社員テーブルの「部署ID」がNULLなら「まだ部署に配属されていない」状態を表せます。主キーはNULL不可ですが、外部キーにはこの制限はありません。ただしNULLにした場合、その行はどの親行とも関連付けられない「孤立した状態」になります。
Q. 外部キーは必ず主キーを参照するのですか?候補キーでもよいのですか?
SQL標準上、外部キーが参照できるのは主キーまたはUNIQUE制約が付いた列(候補キー)です。AP R5秋 午前問27の正解選択肢が「候補キーを参照する属性」となっている通り、主キー以外の候補キーも参照先になり得ます。IPA試験では「主キーを参照」と書かれることが多いですが、厳密には候補キーを含む点を知っておくと選択肢の判別に役立ちます。
Q. 外部キーと「リレーションシップ」は同じ意味ですか?
異なります。リレーションシップはE-R図(Entity-Relationship Diagram)でエンティティ間の関連を概念的に表す用語です。外部キーはその概念的な関連を物理テーブル上で実装する手段にあたります。E-R図で「顧客 ─1:N─ 注文」と描いたリレーションシップが、テーブル設計では「注文テーブルに顧客番号の外部キーを持たせる」形で具体化されます。
Q. 実務で外部キー制約をあえて設定しないケースはありますか?
あります。大量データの一括ロード処理やパフォーマンス最優先のシステムでは、外部キー制約による整合性チェックがボトルネックになることがあり、アプリケーション側で整合性を担保する設計を採るケースがあります。ただし、これはIPA試験の範囲では深掘りされません。試験ではあくまで「外部キー=参照制約を実現する仕組み」として理解していれば得点に支障はありません。