データベーススペシャリスト 2011年 午前2 問17
問題文
SQL において、A 表の主キーがB 表の外部キーによって参照されている場合、行を追加・削除する操作の制限について、正しく整理した図はどれか。ここで、△印は操作が拒否される場合があることを表し、○印は制限なしに操作できることを表す。

選択肢
ア:(正解)
イ:
ウ:
エ:
🔒 解説は解答すると表示されます
外部キーの参照制約【午前2解説】
正解の理由
外部キーは「子表(B)」の行が参照する「親表(A)」の主キーの存在を前提にする制約です。したがって、親表への追加は参照関係を壊さないため常に許可され、親表の削除は参照する子行が存在する場合に拒否されることがあります。一方、子表への追加は参照先の親行が存在しない値を指定すると拒否され、子表の削除は参照整合性を壊さないので制限なしに実行できます。以上の理由により、A表追加:○、A表削除:△、B表追加:△、B表削除:○ を示す選択肢である ア が正解です。
解法ステップ
- 問題の関係を整理する
- A表 = 親(主キーを持つ)
- B表 = 子(外部キーでA表を参照)
- 各操作が参照整合性にどう影響するかを考える
- 親(A)に行を追加:既存の子への影響はない → 許可(○)
- 親(A)から行を削除:その行を参照する子があれば削除できない(オプションでCASCADE等が設定されない限り) → 拒否される場合あり(△)
- 子(B)に行を追加:参照する親が存在しない値なら拒否、存在すれば許可 → 拒否される場合あり(△)
- 子(B)から行を削除:親の整合性に影響しない → 許可(○)
- 上の判断に合致する選択肢を選ぶ → ア
選択肢別の誤答解説
-
ア(正解)
- A追加:○(親の追加は問題なし)、A削除:△(子があれば拒否される場合がある)、B追加:△(参照する親がなければ拒否)、B削除:○(子の削除は問題なし)— 前述のルールと一致します。
-
イ(誤り)
- この図は B追加:○、B削除:△ を示します。子の追加を常に許可するのは誤りです(参照先の親が存在しない場合は拒否されます)。また、子の削除が「拒否される場合がある」とするのも逆で、子削除は通常制限されません。
-
ウ(誤り)
- この図は A追加:△、A削除:○ を示します。親の追加が拒否されることは通常ありません(子の存在に依存しないため)。親削除が常に許可されるというのも、子が存在する場合の挙動と矛盾します。
-
エ(誤り)
- この図は A追加:△、A削除:○、B追加:△、B削除:○ を示します。A追加が△になっている点が誤りです。親追加は参照整合性上拒否される理由がほとんどありません。
よくある誤解
- 親の追加(A表追加)は「子が先にいないとダメ」と誤解する
- 実際には親の行を先に追加しておくのが普通で、親追加で拒否されることは通常ありません。
- 外部キーがあると子の削除も禁止されると誤解する
- 子行の削除は親には影響しないため、基本的に許可されます(ただしトリガ等の副作用は別)。
- デフォルトでON DELETE CASCADEが働くと誤解する
- 多くの設計では明示的にCASCADEを指定しない限り、削除は拒否されます(NO ACTION/RESTRICT がデフォルト)。
補足コラム
参照整合性の振る舞いは外部キー定義で変更できます。代表的なオプション:
- ON DELETE CASCADE:親削除時に参照する子も自動削除する
- ON DELETE SET NULL:親削除時に子の外部キーをNULLにする(外部キーがNULL許容の場合)
- ON DELETE RESTRICT / NO ACTION:親削除を拒否する(デフォルトに相当する挙動)
例:PostgreSQL の外部キー定義
CREATE TABLE A (
id INTEGER PRIMARY KEY
);
CREATE TABLE B (
id INTEGER PRIMARY KEY,
a_id INTEGER REFERENCES A(id) ON DELETE RESTRICT
);
上記では、A の行を削除しようとすると、B に参照行があれば削除は拒否されます。ON DELETE CASCADE にすれば親削除時に子も削除されます。
FAQ
Q. 子の追加が「△」なのは必ず拒否されるということですか?
A. いいえ。△は「拒否される場合がある」を示します。子追加は参照先の親行が存在すれば許可され、存在しなければ拒否されます。
A. いいえ。△は「拒否される場合がある」を示します。子追加は参照先の親行が存在すれば許可され、存在しなければ拒否されます。
Q. データベースによって挙動は違いますか?
A. 基本原則は同じですが、ON DELETE/UPDATE オプションやトランザクションの遅延チェック(遅延制約)等、実装差があります。試験問題では特別な指定がない限り標準的な参照制約(削除禁止)を想定します。
A. 基本原則は同じですが、ON DELETE/UPDATE オプションやトランザクションの遅延チェック(遅延制約)等、実装差があります。試験問題では特別な指定がない限り標準的な参照制約(削除禁止)を想定します。
Q. NULL を持つ外部キーはどう扱われますか?
A. 外部キー列が NULL を許容している場合、NULL 値は参照制約の対象外(参照チェックを行わない)となることが多いです。したがって子追加で NULL を入れることは可能です。
A. 外部キー列が NULL を許容している場合、NULL 値は参照制約の対象外(参照チェックを行わない)となることが多いです。したがって子追加で NULL を入れることは可能です。
関連キーワード: 参照整合性、外部キー、ON DELETE CASCADE、NO ACTION、親子テーブル、参照制約、トランザクション、外部キー制約、整合性制約、データモデリング

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

