ITパスポート 2026年 問72
問題文
関係データベースで管理している“口座”表、“顧客”表及び“取引明細”表がある。新たな顧客が口座の開設と同時に1万円を入金するとき、表にデータを追加する順序として、適切なものはどれか。ここで、下線のうち実線は主キーを、破線は外部キーを表す。

選択肢
ア:口座→顧客→取引明細
イ:顧客→口座→取引明細(正解)
ウ:顧客→取引明細→口座
エ:取引明細→口座→顧客
🔒 解説は解答すると表示されます
口座・顧客・取引明細の追加順序【ITパスポート 解説】
正解の理由
関係データベースでは、ある表の列が別の表の主キー(主キー:その表で各レコードを一意に識別する列。英:primary key)を参照する場合、その参照列は外部キー(外部キー:他の表の主キーを参照する列。英:foreign key)と呼ばれます。外部キーは「参照先の行が存在していること」を前提にするため、参照先(親)のデータが先に存在していなければ追加できません。
図を見ると、
- 「顧客」表の顧客番号は主キー。
- 「口座」表の顧客番号は外部キーで、顧客表の顧客番号を参照している。
- 「取引明細」表の口座番号は外部キーで、口座表の口座番号を参照している。
この親子関係の順にデータを入れる必要があるため、まず顧客を作り、次にその顧客に紐づく口座を作成し、最後にその口座に対する取引明細を記録します。したがって正しい順序は イ の「顧客→口座→取引明細」です。
解法ステップ
- 図からどの列が主キー(実線)で、どの列が外部キー(破線)かを確認する。
- 外部キーは参照先(親)が先に存在しなければならないことを理解する(参照整合性)。
- 親→子 の順で考える:顧客(親)→口座(子)→取引明細(孫)。
- 実際の挿入はデータベースのトランザクション(複数操作を一つにまとめる仕組み)でまとめると安全。
※ 本設問では口座の開設と同時に1万円を入金するケースなので、口座の残高に初期金額を設定するか、口座作成後に取引明細として入金を1件追加する、どちらか(または両方)を行います。
選択肢別の誤答解説
-
ア: 口座→顧客→取引明細
口座を先に追加すると、その口座の顧客番号は「顧客」表の主キーを参照します。まだ顧客が存在しないため、多くのデータベースでは外部キー制約違反となり挿入できません。 -
イ: 顧客→口座→取引明細
正解。親(顧客)を先に作成し、子(口座)、さらに孫(取引明細)の順で追加することで外部キー制約を満たします。 -
ウ: 顧客→取引明細→口座
顧客を先に作っても、取引明細は口座番号を参照しているため、口座がまだない状況では挿入できません。取引明細は口座の存在を前提にするため順序が不適切です。 -
エ: 取引明細→口座→顧客
最も不適切。取引明細は口座を、口座は顧客を参照しているため、全ての参照先が未作成で外部キー違反になります。
よくある誤解
-
「順序は関係ない」は間違い
一部のデータベース設定で外部キー制約を遅延チェック(deferred)にできる場合もありますが、試験では標準的な即時チェックを前提に考えるのが安全です。基本は親を先に入れることを覚えてください。 -
「入金の『時間的順序』と挿入順序を混同する」
実際の出来事としては「入金が先に行われた」と感じても、データベース上の参照関係は別です。参照先が存在しないと記録(取引明細)は入れられません。まず口座(と口座が参照する顧客)を用意します。 -
主キーと外部キーの取り違え
主キーは「その表の識別子」。外部キーは「他の表の識別子を参照する列」です。図の実線=主キー、破線=外部キーをまず確認しましょう。
補足コラム
-
参照整合性(referential integrity)とは
外部キーが常に有効な参照先を指すようにするルールです。これにより「存在しない顧客に紐づく口座」や「存在しない口座に紐づく取引」が起きないようにできます。 -
トランザクション(transaction)での処理
顧客追加→口座追加→取引明細追加を一連のトランザクションで行えば、途中でエラーが起きたときに全て取り消す(ロールバックする)ことができます。これによりデータの不整合を防げます。 -
初期残高の扱い
口座の「残高」を初期値として10000円でINSERTする方法と、口座残高は0で取引明細に「入金10000円」を追加して残高を計算する方法があります。どちらを採るかは設計方針によりますが、実運用では両方(残高を更新し、取引履歴も残す)が一般的です。 -
簡単なSQL例(トランザクションで安全に挿入)
BEGIN;
-- 1 顧客を追加
INSERT INTO 顧客(顧客番号, 顧客名) VALUES ('C001', '山田太郎');
-- 2 口座を追加(残高を初期値として設定)
INSERT INTO 口座(口座番号, 口座種別, 残高, 顧客番号)
VALUES ('A100', '普通', 10000, 'C001');
-- 3 取引明細に入金を記録
INSERT INTO 取引明細(取引番号, 取引日時, 取引種別, 取引金額, 口座番号)
VALUES ('T0001', CURRENT_TIMESTAMP, '入金', 10000, 'A100');
COMMIT;
FAQ
Q. 口座を作るときに顧客番号を空欄(NULL)にすれば順序は問題ないですか?
A. 多くの場合、外部キーはNULLを許さない設計ですし、NULLにすると顧客との関係が失われます。基本は顧客を先に作るべきです。
A. 多くの場合、外部キーはNULLを許さない設計ですし、NULLにすると顧客との関係が失われます。基本は顧客を先に作るべきです。
Q. 外部キーの制約をオフにすれば好きな順で入れられますか?
A. 技術的には可能ですが、参照整合性が崩れるリスクが増えます。実務や試験では推奨されません。
A. 技術的には可能ですが、参照整合性が崩れるリスクが増えます。実務や試験では推奨されません。
Q. 試験問題で「入金と同時に」とあるとき、取引明細は必ず必要ですか?
A. 設計次第ですが、取引履歴を残す設計なら必要です。口座残高だけ更新する簡易設計もありますが、実務では履歴(取引明細)を残すことが重要です。
A. 設計次第ですが、取引履歴を残す設計なら必要です。口座残高だけ更新する簡易設計もありますが、実務では履歴(取引明細)を残すことが重要です。
関連キーワード: リレーショナルデータベース、主キー、外部キー、参照整合性、トランザクション、データ整合性、カスケード、参照制約

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

