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


選択肢
ア:
イ:
ウ:(正解)
エ:
参照の整合性を損なうデータ操作はどれか【午前2 解説】
要点まとめ
- 結論→「注文」表の顧客番号は「顧客」表の主キーを参照する外部キーであり、親に存在しない顧客番号を持つ注文を追加すると参照整合性を損ないます。
- 根拠→外部キー制約は子(注文)の参照先である親(顧客)に対応する主キーが必ず存在することを要求し、参照先不在の挿入が制約違反になります。
- 差がつくポイント→親表の未参照行の削除や子表の行削除は通常問題にならず、親に存在しない値を子に挿入する操作を見抜く力が合格点を分けます。
正解の理由
正解は ウ です。理由は単純です。注文表(子)に顧客番号 F020 を持つ行を追加する操作は、その参照先である顧客表(親)に顧客番号 F020 が存在しないため、外部キー制約に違反して参照の整合性を損ないます。
他の選択肢は参照整合性を壊しません。親に未参照の行(L035)を削除しても参照されていなければ問題にならず、子に存在する顧客(D010)を参照する行を追加するのは許容されます。子表の行削除は参照先を壊さないため問題になりません。
他の選択肢は参照整合性を壊しません。親に未参照の行(L035)を削除しても参照されていなければ問題にならず、子に存在する顧客(D010)を参照する行を追加するのは許容されます。子表の行削除は参照先を壊さないため問題になりません。
よくある誤解
- 「親表の行を削除すると常に整合性違反になる」:親が参照されている場合は違反になりますが、参照されていない行の削除は問題ありません。
- 「子表の行を削除すると参照整合性が壊れる」:外部キーは子が親を参照する制約なので、子を削除しても参照先が消えるわけではなく通常は問題になりません。
- 「同じ顧客番号が存在すればどの操作もOK」:挿入時は参照先が存在するかを確認する必要があり、存在しない場合はNGです(複合的な制約やON DELETE/UPDATE 動作に注意)。
解法ステップ
- 問題文から「注文」の顧客番号が「顧客」の主キーを参照する外部キーであることを確認する。
- 各選択肢が「親(顧客)側への操作」か「子(注文)側への操作」かを判別する。
- 親削除ならその顧客が子で参照されていないか確認、子挿入なら参照先が親に存在するか確認する。
- 参照先が存在しない子への挿入、あるいは参照される親の削除(参照あり)は整合性違反と判定する。
選択肢別の誤答解説
- ア(顧客表の行 L035 を削除する)
解説:顧客 L035 は「注文」表では参照されていないため、削除しても参照整合性は保たれます。親の未参照行の削除は許容されます。 - イ(注文表に行 0005 / D010 を追加する)
解説:顧客 D010 は顧客表に存在するため、外部キーの参照先が満たされており問題になりません。 - ウ(注文表に行 0006 / F020 を追加する)
解説:顧客 F020 が顧客表に存在しないため、追加すると外部キー制約違反となり参照の整合性を損ないます(これが正解)。 - エ(注文表の行 0002 / K001 を削除する)
解説:これは子表の行削除であり、親表(顧客)が参照されなくなるだけで参照整合性を損なう操作ではありません(許容される操作)。
補足コラム
外部キー制約にはON DELETEやON UPDATEの動作指定が可能です。例えばON DELETE CASCADEを設定すると、親を削除した際に参照する子行も自動で削除され、参照整合性の問題を回避できます。設定例(SQL)を示します。
-- 顧客表(親) CREATE TABLE 顧客 ( 顧客番号 CHAR(4) PRIMARY KEY, 顧客名 VARCHAR(100) ); -- 注文表(子): 顧客番号は顧客(顧客番号)を参照する外部キー CREATE TABLE 注文 ( 伝票番号 CHAR(4) PRIMARY KEY, 顧客番号 CHAR(4), FOREIGN KEY (顧客番号) REFERENCES 顧客(顧客番号) ON DELETE RESTRICT );
ON DELETE RESTRICT(デフォルト)だと、親が子に参照されている場合は親の削除を拒否します。ON DELETE CASCADE や ON DELETE SET NULL などの挙動も用途に応じて使い分けます。
FAQ
Q1: 親の行を削除すると自動で子も消えることはありますか?
A1: はい。ON DELETE CASCADE を指定している場合は親削除で子も自動削除されます。指定がなければ削除はエラーになります。
A1: はい。ON DELETE CASCADE を指定している場合は親削除で子も自動削除されます。指定がなければ削除はエラーになります。
Q2: 子の行を削除したら親表の値に影響はありますか?
A2: 基本的に影響はありません。子の削除は参照先の存在を壊すものではないため参照整合性の問題になりません。
A2: 基本的に影響はありません。子の削除は参照先の存在を壊すものではないため参照整合性の問題になりません。
Q3: 外部キー違反は挿入だけで起きますか?
A3: 挿入の他、親の削除(参照あり)や親の主キー更新(参照ありでON UPDATE未指定)でも違反が起きます。
A3: 挿入の他、親の削除(参照あり)や親の主キー更新(参照ありでON UPDATE未指定)でも違反が起きます。
関連キーワード: 関係データベース、外部キー、参照整合性、主キー、外部キー制約、ON DELETE、CASCADE、SQL、参照制約

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

