応用情報技術者 2018年 春期 午前2 問28
問題文
SQLにおいて、A表の主キーがB表の外部キーによって参照されている場合、各表の行を追加・削除する操作の参照制約に関する制限について、正しく整理した図はどれか。ここで、△印は操作が拒否される場合があることを表し、○印は制限なしに操作ができることを表す。

選択肢
ア:(正解)
イ:
ウ:
エ:
🔒 解説は解答すると表示されます
外部キー参照制約【午前2解説】
正解の理由
正解は ア です。A表が主キー(親)、B表がその主キーを参照する外部キー(子)である場合、参照制約(リファレンシャルインテグリティ)は「親を削除するとき」と「子を追加するとき」に問題を生じさせます。具体的には次の組合せが正しい振る舞いです:A表の追加は○、A表の削除は△、B表の追加は△、B表の削除は○。
- A表の追加(親の挿入)は参照先の有無に依存せず許可されるため○。
- A表の削除(親の削除)は、その行がB表から参照されている場合は拒否される(△)。
- B表の追加(子の挿入)は、参照する親のキーが存在しないと拒否される可能性があるため△。
- B表の削除(子の削除)は参照を除去する操作なので制約には抵触せず○。
この振る舞いが表現されている図が選択肢の ア に対応します。
解法ステップ
- 参照関係の向きを確認する(誰が親で誰が子か)。今回、Aが親(主キー)、Bが子(外部キー)。
- 「挿入(追加)」を考える:
- 親を追加→参照先を要求しないため基本的に問題なし(○)。
- 子を追加→参照先の親行が存在しないと制約違反で拒否されうる(△)。
- 「削除」を考える:
- 親を削除→その親を参照する子が存在する場合は削除が拒否されうる(△)。
- 子を削除→参照関係を壊す側ではなく参照を除く操作のため通常問題なし(○)。
- 各選択肢と照合して、上の4パターンと一致するものを選ぶ。
選択肢別の誤答解説
- ア(正解)
A追加:○、A削除:△、B追加:△、B削除:○。上記の論理と一致する。 - イ(誤り)
イはB表の追加を○、B表の削除を△としている(B追加が許可、B削除が拒否)。しかし子の削除が拒否される根拠はなく、むしろ子の追加が参照先存在の制約で拒否される可能性があるため不適切。 - ウ(誤り)
ウはA表の追加を△、A表の削除を○としている。親の追加が拒否される状況は通常ない(参照先の有無に依存しない)ため誤り。親の削除が常に許されるとも限らない(参照されていれば拒否される)ので不適合。 - エ(誤り)
エはA表の追加を△、A表の削除を○にしている点で誤り(親の追加は通常○)。B表の追加が△、B表の削除が○である点は正しいが、A表の扱いが逆になっているため全体として誤り。
よくある誤解
- 親(主キー)を削除しても問題ないと考える誤解:親を削除すると、その行を参照する子行が存在する場合は参照制約により削除が拒否される(ON DELETE CASCADE 等が設定されていれば挙動は変わるが、何も指定がなければ拒否される)。
- 子(外部キー)を追加する際は必ず成功すると考える誤解:子の外部キー値が親に存在しない場合は挿入が拒否される(NULL許容やデフォルト、親の存在確認が影響する)。
- 親を追加する際に参照先が必要だと思う誤解:親の追加は参照される側の操作であり、参照先が存在するかは関係しないため通常制限はない。
補足コラム
参照制約の挙動は外部キー定義のオプションで変わります。代表的なオプション例:
- ON DELETE NO ACTION / RESTRICT(デフォルト的挙動):子が存在する親の削除を拒否。
- ON DELETE CASCADE:親削除時に参照する子を自動削除。
- ON DELETE SET NULL:親削除時に子の外部キーをNULLにする(外部キーがNULL許容の場合)。
例(SQL)
CREATE TABLE A (
id INT PRIMARY KEY
);
CREATE TABLE B (
id INT PRIMARY KEY,
a_id INT,
FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE RESTRICT
);
-- Aへの挿入は常に可能
INSERT INTO A (id) VALUES (1); -- ○
-- Bへ参照が存在する値で挿入すれば○、存在しなければエラー(△)
INSERT INTO B (id, a_id) VALUES (1, 1); -- ○(Aにid=1があれば)
INSERT INTO B (id, a_id) VALUES (2, 9); -- エラー(Aにid=9がなければ)△
-- Aを削除しようとすると、Bが参照していれば拒否(△)
DELETE FROM A WHERE id = 1; -- Bに参照があれば失敗(ON DELETE CASCADEでなければ)
FAQ
Q1: 外部キーがNULL許容なら子の追加は常に○ですか?
A1: 外部キーがNULLを許容し、挿入時にNULLを入れるならその操作自体は参照制約に抵触しません。ただし参照する値を入れた場合は親の存在を要求されます。
A1: 外部キーがNULLを許容し、挿入時にNULLを入れるならその操作自体は参照制約に抵触しません。ただし参照する値を入れた場合は親の存在を要求されます。
Q2: ON DELETE CASCADE があれば親の削除は常に○ですか?
A2: はい。ON DELETE CASCADE が設定されていれば、親を削除すると自動で参照する子も削除されるため削除は可能(○)。
A2: はい。ON DELETE CASCADE が設定されていれば、親を削除すると自動で参照する子も削除されるため削除は可能(○)。
Q3: 更新(UPDATE)はどう扱われますか?
A3: 外部キーが参照する親キーを更新するときは、ON UPDATE の指定に従います。多くの場合、親キーの更新は避ける設計が推奨されます。
A3: 外部キーが参照する親キーを更新するときは、ON UPDATE の指定に従います。多くの場合、親キーの更新は避ける設計が推奨されます。
関連キーワード: 外部キー、参照整合性、主キー、ON DELETE CASCADE、挿入制約、削除制約、リファレンシャルインテグリティ

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

