情報処理安全確保支援士 2014年 春期 午前2 問21
問題文
関係モデルにおける外部キーに関する記述のうち、適切なものはどれか。
選択肢
ア:外部キーの値は、その関係の中で一意でなければならない。
イ:外部キーは、それが参照する候補キーと比較可能でなくてもよい。
ウ:参照先の関係に、参照元の外部キーの値と一致する候補キーが存在しなくてもよい。
エ:一つの関係に外部キーが複数存在してもよい。(正解)
🔒 解説は解答すると表示されます
外部キーの制約【午前2解説】
正解の理由
一つの関係(テーブル)に外部キーが複数存在しても問題なく定義できるため、選択肢のエが正しいです。外部キー(foreign key)は、ある属性または複合属性が別の関係の候補キー(または一意制約のあるキー)を参照するという制約を示しますが、その参照を行う属性は複数存在して構いません(たとえば複数の参照先テーブルを持つ、あるいは同一参照先を複数属性で参照するケースなど)。
参照整合性について重要な点は、外部キーがNULLを許容する場合、NULLである行については参照先が存在する必要はないことです。参照整合性の要件は「外部キーがNULLでないときに、参照先の候補キーと一致する値が参照先に存在すること」です。従って、外部キーの複数定義は問題なく、参照整合性はNULL許容の扱いを含めて評価されます。
参照整合性について重要な点は、外部キーがNULLを許容する場合、NULLである行については参照先が存在する必要はないことです。参照整合性の要件は「外部キーがNULLでないときに、参照先の候補キーと一致する値が参照先に存在すること」です。従って、外部キーの複数定義は問題なく、参照整合性はNULL許容の扱いを含めて評価されます。
解法ステップ
- 外部キー(FK)の定義を思い出す:他の関係の候補キーを参照する属性であること。
- 各選択肢を、FKの性質(一意性、比較可能性、参照整合性、複数定義可否)と照らし合わせる。
- NULLの扱いを忘れずに、参照整合性が「必ず参照先が存在しなければならない」のか「NULL時は例外か」を判定する。
- 最終的に「一つの関係に複数のFKがあってよい」という点が妥当かを確認する。
選択肢別の誤答解説
-
ア: 「外部キーの値は、その関係の中で一意でなければならない。」
誤り。外部キーは参照関係を示す属性であり、そのテーブル内で重複してよい(多対一の関係が典型)。一意である必要があるのは候補キー(または主キー・一意制約)の側であり、外部キー側は多くの場合重複を許す。 -
イ: 「外部キーは、それが参照する候補キーと比較可能でなくてもよい。」
誤り。参照を成立させるために、外部キーと参照先候補キーは互換なドメイン(データ型や比較可能性)である必要がある。多数のDBMSでは列のデータ型や長さ、符号等が一致または互換でなければ外部キー制約を宣言できない。 -
ウ: 「参照先の関係に、参照元の外部キーの値と一致する候補キーが存在しなくてもよい。」
通常は誤り。参照整合性により、外部キーの値(NULLでない場合)は参照先関係の候補キーと一致する行が存在する必要がある。ただし重要な例外があり、外部キー列がNULLを許容している場合、その行は参照先が存在しなくてもよい(NULLは「無効な参照」を表すが整合性違反とはならない)。 -
エ: 「一つの関係に外部キーが複数存在してもよい。」
正しい。1つのテーブルは複数の外部キーを持つことができ、別々の参照先を指すことも、同一の参照先を複数属性で指すことも可能である(例:部署テーブルに「上司ID」「代理者ID」など複数の従業員参照があるケース)。このためエが適切。
よくある誤解
- 外部キーが「必ず一意でなければならない」と混同する(主キー/候補キーと混同)。外部キーは参照を表す属性で一意である必要はない。
- NULLの扱いを無視して、参照先が常に存在しなければならないと断定する。実務では外部キー列がNULL許容ならその行は参照整合性違反とはならない。
- 「外部キーは参照先の主キーでなければならない」と誤解する。多くのDBMSでは参照先が候補キーや一意制約の列であれば参照可能である(主キーである必要はない)。
補足コラム
- 実務でよく使われるオプション
- ON DELETE CASCADE / ON UPDATE CASCADE:参照先が削除・更新されたときに参照元を連動させる。
- ON DELETE SET NULL:参照先削除時に外部キーをNULLにして参照を解除(外部キーがNULL許容である必要がある)。
- 自己参照(自己外部キー)や複合外部キーも一般的です。複合外部キーは参照先の候補キーが複数列から構成される場合に使用します。
- パフォーマンス面では外部キー制約の有無がINSERT/DELETE/UPDATEのコストに影響します。大規模データ移行時は一時的に制約を外して作業するケースがありますが、再適用時に整合性をチェックする必要があります。
SQL例(外部キーがNULLを許容し、ON DELETE SET NULLを指定する例):
CREATE TABLE department (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(100),
manager_id INT,
department_id INT,
FOREIGN KEY (manager_id) REFERENCES employee(id), -- 自己参照
FOREIGN KEY (department_id) REFERENCES department(id) ON DELETE SET NULL
);
この例では employee テーブルに複数の外部キー(自己参照の manager_id と department 参照の department_id)が定義されており、外部キー列がNULLを許容することで参照先が存在しない場合でも問題にならない行があり得ます。
FAQ
Q: 外部キーはNULLを許容できますか?
A: はい。外部キー列がNULLを許容していれば、その行の外部キー値がNULLのときは参照先の存在は要求されません。参照整合性は「NULLでない外部キー値が参照先の候補キーと一致すること」を要求します。
A: はい。外部キー列がNULLを許容していれば、その行の外部キー値がNULLのときは参照先の存在は要求されません。参照整合性は「NULLでない外部キー値が参照先の候補キーと一致すること」を要求します。
Q: 外部キーは参照先の主キーでなければなりませんか?
A: 必須ではありません。参照先が候補キーや一意制約を持つ列であれば、多くのDBMSで参照可能です(ただしDBMSによって実装の細かい制約があります)。
A: 必須ではありません。参照先が候補キーや一意制約を持つ列であれば、多くのDBMSで参照可能です(ただしDBMSによって実装の細かい制約があります)。
Q: 同一テーブルに同じ参照先への外部キーが複数あってもよいですか?
A: はい。業務的には「担当者」「承認者」「作成者」など同じユーザーテーブルを複数の役割で参照するケースがあり、問題ありません。
A: はい。業務的には「担当者」「承認者」「作成者」など同じユーザーテーブルを複数の役割で参照するケースがあり、問題ありません。
関連キーワード: 外部キー、参照整合性、候補キー、NULL許容、複合外部キー、ON DELETE SET NULL、自己参照、一意制約

\ せっかくなら /
情報処理安全確保支援士を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

