外部キーとは?がいぶきー
外部キーとは、他の表の主キー(または一意キー)を参照することで、表と表の関連を表す属性。参照先に存在しない値を持てないという参照整合性制約をDBMSが保証するため、アプリ側の実装漏れによる不整合を防げる。主キーと違ってNULLを許し(どこも参照していない状態を表せる)値の重複も許すため、多対1の関連を表現できる。参照先を削除・更新したときの動作はCASCADE・RESTRICT/NO ACTION・SET NULLなどから選んで宣言する。
最終更新:2026-10-06
この語が出る過去問を解く →背景
関連の正しさをアプリケーションだけで守ろうとすると、同じ表に触れる経路(画面・バッチ・手作業のSQL)の数だけ検査を書くことになり、どれか一つの漏れが親のいない行として残る。しかもその不整合は発生した瞬間ではなく、月次の集計が合わないという形でずっと後になって表面化する。整合性の宣言をDBMS側へ一度だけ置くのが外部キーであり、応用情報では「どこで守るか」という設計判断として問われる。
具体例
配送明細表の「荷物番号」を荷物表の主キーへの外部キーとして宣言しておけば、存在しない荷物番号の明細行は登録できず、明細が残っている荷物を消そうとすれば拒否される(RESTRICT)。社員表の「上司の社員番号」が同じ社員表の主キーを参照する自己参照外部キーは、組織の階層構造を1つの表で表す例である。
試験での引っ掛け
主キーとの違いが狙われる。外部キーはNULLも値の重複も許されるが、主キーはどちらも許されない。参照先は任意の列ではなく、主キーまたは一意制約のある列でなければならない。削除の連鎖(CASCADE)が起きるのは参照「される」側を消したときであって、参照する側を消したときではない——向きを取り違えやすい。
関連用語
出た過去問
出典:平成28年度 春期 応用情報技術者試験 午前 問29(IPA)
次の表において,“在庫”表の製品番号に定義された参照制約によって拒否される可能性がある操作はどれか。ここで,実線の下線は主キーを,破線の下線は外部キーを表す。 …
正解:“在庫”表への行追加
要点:外部キーは参照先に存在しない値の登録を拒否する
参照制約は、外部キーの値が参照先の主キーに存在することを要求する。在庫表に行を追加するとき、製品表に存在しない製品番号を指定すると制約違反となり拒否される。
出典:平成29年度 春期 応用情報技術者試験 午前 問28(IPA)
“部品”表のメーカコード列に対し,B+木インデックスを作成した。これによって,“部品”表の検索の性能改善が最も期待できる操作はどれか。ここで,部品及びメーカのデ…
正解:メーカコードの値が4001以上,4003以下の部品を検索する。
要点:B+木インデックスは範囲検索で最も効果を発揮する
B+木インデックスは値が大小順に並び、葉ノードが順につながっているため、ある範囲に含まれる値をまとめて取り出す範囲検索で効果が大きい。値の種類が多く均一に分散していれば、絞り込まれる行数も少なくて済む。
出典:平成30年度 秋期 応用情報技術者試験 午前 問29(IPA)
“部品”表のメーカコード列に対し,B+木インデックスを作成した。これによって,“部品”表の検索の性能改善が最も期待できる操作はどれか。ここで,部品及びメーカのデ…
正解:メーカコードの値が4001以上,4003以下の部品を検索する。
要点:B+木インデックスは絞り込みの効く範囲・等値検索で効果が大きい。
B+木インデックスは葉ノードがキー順に連結されているため、ある範囲に収まる値を探す検索や、特定の値に等しい行を探す検索で効率がよい。値の種類が多く均一に分散している状況で、限られた範囲だけを取り出す検索は、絞り込みが強く働くのでインデックスの効果が大きい。一方、否定条件のように表の大部分が該当する検索では、表全体を読むほうが速く、インデックスは活かせない。
出典:平成30年度 春期 応用情報技術者試験 午前 問28(IPA)
SQLにおいて、A表の主キーがB表の外部キーによって参照されている場合、各表の行を追加・削除する操作の参照制約に関する制限について、正しく整理した図はどれか。こ…
正解:ア:A表(追加〇/削除△)、B表(追加△/削除〇)
要点:参照制約は子表の追加と親表の削除が拒否され得る
参照制約では、子表(B表)に親表(A表)に存在しない外部キー値を入れられない。したがってB表への追加は拒否される場合があり、A表への追加は自由に行える。削除は逆で、B表から参照されているA表の行は削除が拒否される場合があるが、B表の行の削除は制約に触れない。よってA表は追加〇・削除△、B表は追加△・削除〇となる。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。