外部キーと参照整合性、どの表のどの列に設定するか
ITパスポート試験 令和8年度 問57 / データベース › データベース設計
過去問にチャレンジ
関係データベースで管理している「学生」表、「科目」表、「成績」表がある。1人の学生は複数の科目を履修するものとし、「学生」表に登録されていない学生や、「科目」表に登録されていない科目は「成績」表に登録できないものとするとき、外部キーとして設定するのが適切なものはどれか。ここで、表中の下線は主キーを表す。

- ア
“学生”表の学生番号、“成績”表の学生番号
- イ
“学生”表の学生名、“科目”表の科目名
- ウ
“成績”表の学生番号と科目コード
- エ
“成績”表の成績
会話形式の解説
講師今回は外部キーの問題です。外部キーは、別の表の主キーを参照する列のことです。図の3つの表で、どの表がほかの表の値を使っているかに注目してください。
受験者成績表に、学生番号と科目コードがあります。G001やK002のように、学生表や科目表の主キーと同じ値が入っています。
講師そうです。成績表が学生表と科目表を参照している、という関係です。外部キーは、参照する側の表、つまり子表の列に設定します。参照される側を親表と呼びます。
受験者では、学生表の学生番号と成績表の学生番号を組み合わせた選択肢はどうでしょうか。どちらも学生番号なので、つながっているように見えます。
講師成績表の学生番号は、外部キーとして正しい列です。ただ、学生表の学生番号は参照される側の主キーなので、外部キーを設定する列ではありません。さらに、成績表の科目コードが入っていないので、科目表にない科目の登録を防げません。
受験者半分は合っていても、問題文の条件の科目のほうが足りないのですね。学生名と科目名の組み合わせはどうですか。
講師学生名も科目名も主キーではなく、ほかの表から参照されている列でもありません。名前は同じものが重なったり、あとで変わったりすることがあるので、参照に使うキーには向きません。
受験者成績表の成績の列も違いますよね。中身は優・良・可なので、ほかの表の行を指していません。
講師その通りです。評価の値なので外部キーにはなりません。残るのは、成績表の学生番号と科目コードの2列です。それぞれ学生表と科目表を参照するので、未登録の学生や科目は成績表に登録できなくなります。
受験者ただ、成績表ではその2列に下線があります。主キーなのに外部キーにもなれるのか、そこで迷いました。
講師なれます。成績表ではG001やK002が2回ずつ出てくるので、1列だけでは行を特定できません。そこで2列を組み合わせて主キーにしています。これを複合主キーといいます。その列が同時に外部キーを兼ねることもあります。
受験者まとめると、外部キーは参照する側の表にあって、親表の主キーを指す列です。主キーかどうかとは別に考えればよいのですね。
講師はい。外部キーを設定すると、参照先に存在しない値は登録できなくなります。これを参照整合性が保たれるといいます。「主キーだから外部キーではない」と考えて正解を外してしまうのが、よくある引っかけです。
まとめ
外部キーは、別の表の主キーを参照する列で、参照する側の表(子表)に設定します。この問題では、成績表の学生番号が学生表を、科目コードが科目表を参照しているため、成績表のこの2列を外部キーにします。そうすると、学生表や科目表にない値は成績表に登録できなくなり、参照整合性が保たれます。成績表ではこの2列が複合主キーでもありますが、主キーの列が外部キーを兼ねることは問題ありません。参照される側の主キーや名称の列、評価値の列は外部キーにはなりません。
解答・解説
正解はウです
この問題のテーマ
関係データベースの外部キーをどの表のどの列に設定するかを問う問題です。外部キーを使うと、表どうしの参照関係が正しく保たれます(参照整合性)。
解き方の考え方
まず、どの表がほかの表を参照しているかを確かめます。図の成績表には学生番号と科目コードがあり、それぞれ学生表と科目表の主キーと同じ値(G001、K002など)が入っています。外部キーは参照する側(子表)の列に設定するので、成績表の学生番号と科目コードが候補になります。この2列に外部キーを設定すると、学生表や科目表にない値は成績表に登録できなくなり、問題文の条件を満たします。
選択肢ごとの解説
- ×ア “学生”表の学生番号、“成績”表の学生番号学生表の学生番号は、成績表から参照される側の主キーです。外部キーを設定する列ではありません。また、成績表の科目コードが含まれていないため、科目表にない科目の登録を防げません。
- ×イ “学生”表の学生名、“科目”表の科目名学生名と科目名は、どちらも主キーではありません。ほかの表から参照される列でもありません。名称は同じものが重なったり変わったりすることがあるため、参照に使うキーには向きません。
- ○ウ “成績”表の学生番号と科目コード成績表の学生番号は学生表の学生番号を、科目コードは科目表の科目コードを参照します。この2列を外部キーにすると、未登録の学生や科目は成績表に登録できなくなります。この2列は成績表の主キー(複合主キー)でもあり、外部キーを兼ねることができます。
- ×エ “成績”表の成績成績表の成績は「優」「良」「可」といった評価の値です。ほかの表の行を参照する列ではないため、外部キーにはなりません。
補足
成績表では、同じ学生番号や同じ科目コードが何度も現れます(図ではG001やK002が2回ずつ)。このため、学生番号や科目コードだけでは行を特定できず、2列を組み合わせて主キーにしています。「主キーだから外部キーではない」と考えて、ウを外してしまわないよう注意してください。
POINT
- 外部キーは、別の表の主キーを参照する列です。
- 外部キーは参照する側(子表)の列に設定し、参照される側(親表)の主キーには設定しません。
- 外部キーを設定すると、参照先に存在しない値は登録できなくなり、参照整合性が保たれます。
- 主キーを構成する列が、同時に外部キーになることもあります。
