戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2026年 72


問題文

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

選択肢

口座→顧客→取引明細
顧客→口座→取引明細(正解)
顧客→取引明細→口座
取引明細→口座→顧客

🔒 解説は解答すると表示されます

口座・顧客・取引明細の追加順序【ITパスポート 解説】

正解の理由

関係データベースでは、ある表の列が別の表の主キー(主キー:その表で各レコードを一意に識別する列。英:primary key)を参照する場合、その参照列は外部キー(外部キー:他の表の主キーを参照する列。英:foreign key)と呼ばれます。外部キーは「参照先の行が存在していること」を前提にするため、参照先(親)のデータが先に存在していなければ追加できません。
図を見ると、
  • 「顧客」表の顧客番号は主キー。
  • 「口座」表の顧客番号は外部キーで、顧客表の顧客番号を参照している。
  • 「取引明細」表の口座番号は外部キーで、口座表の口座番号を参照している。
この親子関係の順にデータを入れる必要があるため、まず顧客を作り、次にその顧客に紐づく口座を作成し、最後にその口座に対する取引明細を記録します。したがって正しい順序は の「顧客→口座→取引明細」です。

解法ステップ

  1. 図からどの列が主キー(実線)で、どの列が外部キー(破線)かを確認する。
  2. 外部キーは参照先(親)が先に存在しなければならないことを理解する(参照整合性)。
  3. 親→子 の順で考える:顧客(親)→口座(子)→取引明細(孫)。
  4. 実際の挿入はデータベースのトランザクション(複数操作を一つにまとめる仕組み)でまとめると安全。
※ 本設問では口座の開設と同時に1万円を入金するケースなので、口座の残高に初期金額を設定するか、口座作成後に取引明細として入金を1件追加する、どちらか(または両方)を行います。

選択肢別の誤答解説

  • ア: 口座→顧客→取引明細
    口座を先に追加すると、その口座の顧客番号は「顧客」表の主キーを参照します。まだ顧客が存在しないため、多くのデータベースでは外部キー制約違反となり挿入できません。
  • : 顧客→口座→取引明細
    正解。親(顧客)を先に作成し、子(口座)、さらに孫(取引明細)の順で追加することで外部キー制約を満たします。
  • ウ: 顧客→取引明細→口座
    顧客を先に作っても、取引明細は口座番号を参照しているため、口座がまだない状況では挿入できません。取引明細は口座の存在を前提にするため順序が不適切です。
  • エ: 取引明細→口座→顧客
    最も不適切。取引明細は口座を、口座は顧客を参照しているため、全ての参照先が未作成で外部キー違反になります。

よくある誤解

  1. 「順序は関係ない」は間違い
    一部のデータベース設定で外部キー制約を遅延チェック(deferred)にできる場合もありますが、試験では標準的な即時チェックを前提に考えるのが安全です。基本は親を先に入れることを覚えてください。
  2. 「入金の『時間的順序』と挿入順序を混同する」
    実際の出来事としては「入金が先に行われた」と感じても、データベース上の参照関係は別です。参照先が存在しないと記録(取引明細)は入れられません。まず口座(と口座が参照する顧客)を用意します。
  3. 主キーと外部キーの取り違え
    主キーは「その表の識別子」。外部キーは「他の表の識別子を参照する列」です。図の実線=主キー、破線=外部キーをまず確認しましょう。

補足コラム

  • 参照整合性(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にすると顧客との関係が失われます。基本は顧客を先に作るべきです。
Q. 外部キーの制約をオフにすれば好きな順で入れられますか?
A. 技術的には可能ですが、参照整合性が崩れるリスクが増えます。実務や試験では推奨されません。
Q. 試験問題で「入金と同時に」とあるとき、取引明細は必ず必要ですか?
A. 設計次第ですが、取引履歴を残す設計なら必要です。口座残高だけ更新する簡易設計もありますが、実務では履歴(取引明細)を残すことが重要です。

関連キーワード: リレーショナルデータベース、主キー、外部キー、参照整合性、トランザクション、データ整合性、カスケード、参照制約
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について