マナビングITパスポート

外部キーの参照関係から表にデータを追加する順序を考える

ITパスポート試験 令和8年度 問72 / データベース › データ操作

過去問にチャレンジ

令和8年度 問72

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

令和8年度 問72の図
  1. ア

    口座 → 顧客 → 取引明細

  2. イ

    顧客 → 口座 → 取引明細

  3. ウ

    顧客 → 取引明細 → 口座

  4. エ

    取引明細 → 口座 → 顧客

会話形式の解説

講師講師
この問題の論点は、外部キーです。図の下線のうち、実線が主キー、破線が外部キーを表しています。まず破線の項目を探して、どの表がどの表を参照しているかを確かめましょう。
受験者受験者
破線は「口座」表の顧客番号と、「取引明細」表の口座番号の2か所です。でも、外部キーが何をするものなのか、まだはっきりしていません。
講師講師
外部キーは、ほかの表の主キーを参照する項目です。外部キーには、参照先の表に既にある値しか入れられません。この決まりを外部キー制約といい、表どうしの参照に矛盾がない状態を参照整合性といいます。
受験者受験者
ということは、「口座」表の顧客番号には、「顧客」表に登録済みの顧客番号しか入れられないのですね。
講師講師
その通りです。同じように、「取引明細」表の口座番号は「口座」表を参照しています。参照される側を親、参照する側を子と呼ぶと、依存関係はどうなりますか。
受験者受験者
顧客が親で口座が子、口座が親で取引明細が子です。顧客←口座←取引明細と並ぶので、顧客、口座、取引明細の順に追加すればよいと考えました。
講師講師
そのとおりで、それが正解の順序です。ほかの表を参照していない顧客を最初に登録します。次に、その顧客番号を参照する口座を作ります。最後に、その口座番号を参照する取引明細として1万円の入金を記録します。どの時点でも、外部キーの参照先が存在しています。
受験者受験者
口座から始める順序は、口座を作る時点で新しい顧客がまだ顧客表にいないので、顧客番号の参照先がなく成り立たない、ということですね。
講師講師
はい。外部キー制約に反してしまいます。顧客を最初に登録する点は同じでも、その次に取引明細を追加する順序はどうでしょうか。
受験者受験者
最初の顧客は合っていますが、取引明細を追加する時点では、参照先の口座がまだ登録されていません。なので、その順序も誤りだと思います。
講師講師
その通りです。もう一つ、取引明細から始める順序も見ておきましょう。これは依存関係のちょうど逆です。取引明細を追加する時点では口座も顧客も未登録なので、外部キーの参照先がなく、成り立ちません。
受験者受験者
破線の外部キーから参照関係をたどって、参照される親の表から先に登録する、と覚えておきます。
講師講師
よい整理です。補足すると、データを削除するときは追加と逆で、子の表から先に消すのが基本です。親を先に消すと、子の外部キーが存在しない値を指すことになるためです。実務では一連の追加を1つのトランザクション(ひとまとまりの処理)にまとめ、途中でエラーが起きたら全体を取り消せるようにします。

まとめ

外部キーには、参照先の表に既にある主キーの値しか入れられません。図では、「口座」表の顧客番号が「顧客」表を参照し、「取引明細」表の口座番号が「口座」表を参照しています。そのため、参照される親の表から順に、顧客、口座、取引明細の順で追加すると、外部キー制約を満たせます。口座や取引明細を先に追加する順序では、追加する時点で参照先がまだないため成り立ちません。データを削除するときは逆に、子の表から先に消すのが基本です。

解答・解説

正解はイです

この問題のテーマ

関係データベースで、外部キー制約(参照整合性)を守るには、どの順で表にデータを追加すればよいかを問う問題です。

解き方の考え方

まず図で破線の下線が引かれた外部キーを探し、どの表がどの表を参照しているかを確かめます。「口座」表の顧客番号は「顧客」表を参照し、「取引明細」表の口座番号は「口座」表を参照しています。外部キーには参照先の表に既にある値しか入れられないので、参照される側(親)の表から先に登録します。依存関係を並べると「顧客←口座←取引明細」となり、追加する順序は顧客、口座、取引明細に決まります。

選択肢ごとの解説

  1. ×ア  口座 → 顧客 → 取引明細
    口座を最初に追加する順序は成り立ちません。口座表の顧客番号は外部キーですが、この時点では新しい顧客がまだ顧客表に登録されていません。参照先の値がないため、外部キー制約に反します。
  2. ○イ  顧客 → 口座 → 取引明細
    他の表を参照しない顧客を最初に登録し、次にその顧客番号を参照する口座を、最後にその口座番号を参照する取引明細(1万円の入金)を追加します。親から子への順なので、どの時点でも外部キーの参照先が存在し、制約を満たします。
  3. ×ウ  顧客 → 取引明細 → 口座
    最初に顧客を登録する点は正しいのですが、その次に取引明細を追加しています。取引明細の口座番号が参照する口座がまだ登録されていないため、参照先がなく、外部キー制約に反します。
  4. ×エ  取引明細 → 口座 → 顧客
    取引明細を最初に追加する順序で、依存関係とちょうど逆になっています。取引明細を追加する時点では口座も顧客も未登録なので、外部キーの参照先がありません。

補足

データを削除するときは、追加とは逆に子の表から先に消すのが基本です。親を先に消すと、子の外部キーが存在しない値を指すことになるためです。また、外部キー制約の役割は、参照先にないデータが登録されるのを防ぐことにあります。実務では一連の追加を1つのトランザクションにまとめ、途中でエラーが起きたら全体を取り消せるようにします。

POINT

  • 主キーは実線の下線、外部キーは破線の下線で示されるという表記を押さえておきます。
  • 外部キーに入れる値は、参照先の表の主キーとして既に存在していなければなりません。
  • データを追加するときは、参照される親の表を先に、参照する子の表を後に登録します。
  • 他の表を参照していない表(この問題では顧客表)が、最初に登録する表になります。

※出典:令和8年度 ITパスポート試験 問72(一部改変)