ITパスポート 2026年 問57
問題文
関係データベースで管理している“学生”表、“科目”表、“成績”表がある。1人の学生は複数の科目を履修するものとし、“学生”表に登録されていない学生や、“科目”表に登録されていない科目は“成績”表に登録できないものとするとき、外部キーとして設定するのが適切なものはどれか。ここで、表中の下線は主キーを表す。

選択肢
ア:“学生”表の学生番号、“成績”表の学生番号
イ:“学生”表の学生名、“科目”表の科目名
ウ:“成績”表の学生番号と科目コード(正解)
エ:“成績”表の成績
🔒 解説は解答すると表示されます
外部キーに関する問題(学生・科目・成績)【ITパスポート 解説】
正解の理由
この問題で求められているのは、「成績(子)表に登録される行は、学生表や科目表(親表)に存在するものだけに制限したい」という要件を満たすために、どの列を外部キー(foreign key)として設定すべきか、という点です。
外部キー(foreign key:別の表の主キーを参照する列)は、参照先の表に存在する主キー(primary key:行を一意に識別する列)だけを子表に許すことで、参照整合性(referential integrity:参照関係が正しく保たれること)を保証します。
この問題では「学生表に登録されていない学生」や「科目表に登録されていない科目」は成績表に登録できないようにしたい、つまり成績表の「学生番号」と「科目コード」がそれぞれ学生表の「学生番号」と科目表の「科目コード」を参照する必要があります。したがって外部キーとして適切なのは、成績表側の「学生番号」と「科目コード」を指定する選択肢、すなわち ウ です。
この問題では「学生表に登録されていない学生」や「科目表に登録されていない科目」は成績表に登録できないようにしたい、つまり成績表の「学生番号」と「科目コード」がそれぞれ学生表の「学生番号」と科目表の「科目コード」を参照する必要があります。したがって外部キーとして適切なのは、成績表側の「学生番号」と「科目コード」を指定する選択肢、すなわち ウ です。
解法ステップ
- 親子関係を把握する
- 「学生」表と「科目」表が親(参照される側)で、「成績」表が子(参照する側)です。
- どの値で参照するかを確認する
- 親表の主キー(学生番号、科目コード)を子表が参照する必要があります。
- 外部キーは子表の列に設定する
- 成績表の「学生番号」と「科目コード」を外部キーにすることで、親表に存在しない値の挿入を防げます。
- まとめ
- よって、成績表の「学生番号」と「科目コード」を外部キーに設定するのが正しい選択です(ウ)。
SQLで表現すると(イメージ):
CREATE TABLE 成績 (
学生番号 VARCHAR(10),
科目コード VARCHAR(10),
成績 CHAR(1),
FOREIGN KEY (学生番号) REFERENCES 学生(学生番号),
FOREIGN KEY (科目コード) REFERENCES 科目(科目コード)
);
選択肢別の誤答解説
- ア: “学生”表の学生番号、“成績”表の学生番号
- 「学生表の学生番号」は主キーとして正しいですが、この選択肢は科目(科目コード)について何も触れていません。問題文では「学生表に登録されていない学生や、科目表に登録されていない科目は成績表に登録できない」とあるため、科目側の参照制約も必要です。アは不十分です。
- イ: “学生”表の学生名、“科目”表の科目名
- 名前(学生名・科目名)は主キーになっていません。主キーは図で下線が引かれている列(学生番号、科目コード)です。名前は重複や変更が起きやすく、外部キーには適さないため誤りです。
- ウ: “成績”表の学生番号と科目コード
- 正解です。成績表が学生表の学生番号と科目表の科目コードを参照することで、親表に存在しない学生や科目を成績表に入れられなくなります。外部キーは子表側に設定するのが基本です。
- エ: “成績”表の成績
- 「成績」列は成績そのもの(優・良・可など)を表すデータです。これは参照先の主キーではなく、外部キーにする意味がありません。
よくある誤解
- 「外部キーは親表と子表の両方に設定する」と考える
- 間違いです。外部キーは参照する側(子表)の列に設定します。親表側は通常、参照される主キーとして設定されます。
- 「名前のような分かりやすい項目を外部キーにすればよい」と考える
- 名前は重複や変更が起きやすいため適していません。参照整合性を確実にするためには、変更されにくい主キー(ここでは学生番号や科目コード)を使います。
- 「外部キーは1列しか指定できない」と思う
- 複数列(複合外部キー)や複数の外部キーを同じ表に設定することは可能です。今回の成績表では学生番号と科目コードの両方を外部キーとして設定します。
補足コラム
- 主キー(primary key)は「各行を一意に識別するための列」です。英語の "primary" は「主要な」という意味で、表の中で最も重要な識別子です。図では下線が引かれた列が主キーです。
- 外部キー(foreign key)は「別の表の主キーを参照する列」です。これにより、データベースは「親表に存在しないデータを子表に入れない」といったルール(参照整合性)を守れます。
- よく使われる運用ルールに「参照整合性の制約」があります。削除や更新時に参照制約違反が起きる場合の挙動(親削除で子も削除する cascade 、削除禁止 restrict など)は設計時に決めます。
FAQ
Q. 外部キーは必ず単一の列ですか?
A. いいえ。複数列を組み合わせた複合外部キーも可能です。また、1つの表に複数の外部キーを定義することもよくあります。
A. いいえ。複数列を組み合わせた複合外部キーも可能です。また、1つの表に複数の外部キーを定義することもよくあります。
Q. 親表の主キーが後で変更されると外部キーの整合性はどうなるのですか?
A. 通常は更新を禁止するか、カスケード更新(親の値を変えると子も自動で変わる)を指定します。値が勝手に変わると参照が壊れるため、主キーはなるべく変更しない設計が望ましいです。
A. 通常は更新を禁止するか、カスケード更新(親の値を変えると子も自動で変わる)を指定します。値が勝手に変わると参照が壊れるため、主キーはなるべく変更しない設計が望ましいです。
Q. 外部キーがないと何が問題ですか?
A. 親表に存在しない学生や科目の成績が成績表に入り込む可能性があり、データの整合性(信頼性)が損なわれます。検索や集計でも誤った結果になります。
A. 親表に存在しない学生や科目の成績が成績表に入り込む可能性があり、データの整合性(信頼性)が損なわれます。検索や集計でも誤った結果になります。
関連キーワード: リレーショナルデータベース、外部キー、主キー、参照整合性、正規化、ER図、スキーマ

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

