基本情報技術者 2010年 秋期 午前(科目A) 問33
問題文
関係データベース“注文”表の“顧客番号”は、“顧客”表の主キー“顧客番号”に対応する外部キーである。このとき、参照の整合性を損なうデータ操作はどれか。ここで、ア〜エの記述におけるデータの並びは、それぞれの表の列の並びと同順とする。


選択肢
ア:
イ:
ウ:(正解)
エ:
参照の整合性を損なうデータ操作はどれか【午前2 解説】
要点まとめ
- 結論:ウは“注文”表に存在しない顧客番号F020を追加する操作であり、参照整合性違反になります。
- 根拠:外部キーは子表(注文)の値が親表(顧客)の主キーに必ず対応している必要があり、存在しない親キーを参照できません。
- 差がつくポイント:操作前に「親表の主キー一覧」と「子表で参照される値」を照合し、親に存在しない値の挿入や参照される親の削除を見抜く習慣を付けること。
正解の理由
選択肢ウは“注文”表に[0006][F020]という行を追加する操作です。外部キー制約により“注文.顧客番号”は“顧客.顧客番号”に存在する値でなければなりません。与えられた“顧客”表にF020は存在しないため、参照整合性が損なわれます。したがってウが正解です。
よくある誤解
- 「子(注文)を削除すれば参照整合性違反になる」と誤解する:子表の行削除は親への参照を減らすため通常問題になりません。
- 「親(顧客)を削除したら必ず違反」と考える誤り:親を削除しても、その親を参照する子が無ければ違反になりません(今回のアは該当顧客が注文に使われていない)。
- 外部キーにNULLや未定義値があっても許されると勘違い:外部キーがNULLを許す設定でない限り、存在しないキーの挿入は違反になります。
解法ステップ
- 問題文から「親(参照される)表」と「子(参照する)表」を特定する(ここでは親=顧客、子=注文)。
- 親表に存在する主キーの一覧を列挙する(C005、D010、K001、L035)。
- 各選択肢の操作が「親の削除」「子の追加」「子の削除」どれかを判別する。
- 子の追加なら追加される顧客番号が親に存在するかを確認。親の削除ならその親が子で参照されているかを確認。
- 参照されている親を削除する、または親に存在しないキーを子に追加する操作があれば違反。
選択肢別の誤答解説
- ア “顧客”表の行 [L035][宮崎] を削除する。
解説:L035は“注文”表で参照されていません(注文の顧客番号はC005、K001、C005、D010)。参照されていない親の削除は整合性違反にならないため、この操作は許容されます。 - イ “注文”表に行 [0005][D010] を追加する。
解説:D010は“顧客”表に存在しますので、外部キー制約は満たされます。参照整合性を損なわない操作です。 - ウ “注文”表に行 [0006][F020] を追加する。
解説:F020は“顧客”表に存在しません。子表に親にない値を追加することは外部キー制約違反であり、参照整合性を損ないます。→ 正解。 - エ “注文”表の行 [0002][K001] を削除する。
解説:子表の行を削除する操作は親を参照している参照を取り除くだけなので、参照整合性を損なうものではありません。
補足コラム
- 多くのDBMSでは外部キー制約により、親キーが存在しない場合の子行追加や、参照されている親行の削除を禁止します。
- ただし制約にオプションを付けることで挙動が変わります(例:ON DELETE CASCADEで親削除時に子も削除、ON DELETE SET NULLで子の外部キーをNULLにする)。問題文に特別な指定がない場合は「存在しない親キーの参照は許されない」と考えます。
- 運用上は削除前に参照チェックを行うか、論理削除(フラグ方式)を採用することで誤消去を防げます。
FAQ
Q1: 親の主キーが削除されても子に同じ値が残っていればよいのでは?
A1: いいえ。親が存在しない状態で子がその値を参照することは参照整合性違反です。DBMSは通常これを禁止します(制約例外が発生)。
A1: いいえ。親が存在しない状態で子がその値を参照することは参照整合性違反です。DBMSは通常これを禁止します(制約例外が発生)。
Q2: 外部キーにNULLが入っている場合はどう評価する?
A2: 外部キー列にNULLを許可している場合、NULLは「不参照」と見なされ、親の存在を要求しないことが多いです。ただし設計次第なので問題文の制約を確認してください。
A2: 外部キー列にNULLを許可している場合、NULLは「不参照」と見なされ、親の存在を要求しないことが多いです。ただし設計次第なので問題文の制約を確認してください。
Q3: ON DELETE CASCADEが設定されていたら親の削除は違反?
A3: CASCADEが設定されていれば、親削除時に自動で関連する子が削除されるため整合性違反にはなりません。問題では特にその指定がないため標準的な制約(禁止)を前提にします。
A3: CASCADEが設定されていれば、親削除時に自動で関連する子が削除されるため整合性違反にはなりません。問題では特にその指定がないため標準的な制約(禁止)を前提にします。
関連キーワード: リレーショナルデータベース、外部キー、参照整合性、外部キー制約、ON DELETE CASCADE、親子テーブル、参照整合性チェック

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

