ITパスポート 2017年 秋期 問88
問題文
関係データベースにおける外部キーに関する記述のうち、適切なものはどれか。
選択肢
ア:外部キーがもつ特性を、一意性制約という。
イ:外部キーを設定したフィールドには、重複する値を設定することはできない。
ウ:一つの表に複数の外部キーを設定することができる。(正解)
エ:複数のフィールドを、まとめて一つの外部キーとして設定することはできない。
🔒 解説は解答すると表示されます
関係データベースの外部キーに関する記述【ITパスポート 解説】
正解の理由
関係データベースでいう外部キー(foreign key:他の表の主キーを参照する列)は、ある表の中で「別の表の行を指し示すための値」を保持します。したがって、1つの表に複数の外部キーを設定することは可能です。例えば「注文(Order)」表が「顧客(Customer)」表の顧客IDと「出荷先(Shipping)」表の出荷先ID、両方を参照する場合、注文表に外部キーが2つ存在します。これが選択肢のウが適切な理由です。
解法ステップ
- 「外部キーとは何か」を簡単に定義する:他の表の主キー(primary key:一意に行を識別する列)を参照する列であると確認する。
- 各選択肢を定義に当てはめる:外部キーが「一意である必要があるか」「複数設定できるか」「複数列をまとめてできないか」などを照らし合わせる。
- 実例を頭に描く:注文表、顧客表、商品表など身近な例で試すと誤りに気づきやすい。
- 最も現実的かつ定義に一致する選択肢を選ぶ。
選択肢別の誤答解説
-
ア: 外部キーがもつ特性を、一意性制約という。
誤り。外部キーは「参照関係(他表の値を参照する)」を示すものであって、必ずしも一意(ユニーク)である必要はありません。一意性制約(unique constraint:列の値が重複しないようにする制約)は別の概念です。外部キーと一意性制約は独立して設定できます。 -
イ: 外部キーを設定したフィールドには、重複する値を設定することはできない。
誤り。外部キーは同じ参照先を複数の行で指すことが普通にあります(例:同じ顧客が複数の注文を出す)。したがって重複(同じ外部キー値の複数行)を許すのが一般的です。必要なら一意性制約を別途付けます。 -
ウ: 一つの表に複数の外部キーを設定することができる。
正しい。1つの表が複数の他表を参照するケースは日常的に発生します(注文→顧客、注文→商品、支払→口座 など)。 -
エ: 複数のフィールドを、まとめて一つの外部キーとして設定することはできない。
誤り。複数の列を組み合わせて1つの外部キー(複合外部キー、composite foreign key)にすることは可能です。参照先の主キーが複数列で構成されている場合に使われます。
よくある誤解
-
外部キー=ユニークだと思う
→ 外部キーは参照を保証するものであって、重複禁止(ユニーク)とは別です。重複を禁止したければ明示的に一意性制約を付けます。 -
外部キーは必ず1つの列だけだと思う
→ 複合(複数列)で外部キーを作ることができます。参照先の主キーが複数列の場合に必要です。 -
外部キーを参照先のテーブルにしか設定できない、という混同
→ 外部キーは「参照する側(子テーブル)」に設定します。参照される側(親テーブル)には主キーなどの一意制約があることが多い、という役割の違いを押さえてください。
補足コラム
-
参照整合性(referential integrity)
外部キーは参照整合性を保つために使います。参照される側に存在しない値が子テーブルに入らないようにするルールです。多くのデータベースでは外部キー制約で「親レコードが削除されたときに子も削除する(ON DELETE CASCADE)」や「削除・更新を禁止する(ON DELETE RESTRICT / NO ACTION)」などの動作を指定できます。 -
NULL と外部キー
外部キー列は NULL(何も値がないこと)を許す設定にもできます。NULLは「参照なし」を意味することが多く、必ず参照を要求するかどうかは設計次第です。 -
SQL例(複数の外部キーと複合外部キー)
-- 例1: 一つの表に複数の外部キー
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
product_id INT,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)
);
-- 例2: 複合外部キー(親の主キーが複数列の場合)
CREATE TABLE Parent (
a INT,
b INT,
PRIMARY KEY (a, b)
);
CREATE TABLE Child (
x INT,
y INT,
FOREIGN KEY (x, y) REFERENCES Parent(a, b)
);
FAQ
Q1: 外部キーは必ず制約として設定しないといけませんか?
A1: 必須ではありませんが、データの整合性を保つために制約として設定するのが一般的です。制約なしだと誤った参照が発生する可能性があります。
A1: 必須ではありませんが、データの整合性を保つために制約として設定するのが一般的です。制約なしだと誤った参照が発生する可能性があります。
Q2: 外部キーで参照先の複数のテーブルを同時に指せますか?
A2: 1つの外部キー列が複数テーブルを直接参照することはできません。必要なら別の外部キー列を追加するか、設計を見直します。
A2: 1つの外部キー列が複数テーブルを直接参照することはできません。必要なら別の外部キー列を追加するか、設計を見直します。
Q3: 外部キーにインデックスは必要ですか?
A3: パフォーマンスや参照整合性の観点から、外部キーの列にインデックスを張ることが推奨される場合があります。DBMS(データベース管理システム)によって自動でインデックスを作ることもあります。
A3: パフォーマンスや参照整合性の観点から、外部キーの列にインデックスを張ることが推奨される場合があります。DBMS(データベース管理システム)によって自動でインデックスを作ることもあります。
関連キーワード: 外部キー、主キー、リレーショナルデータベース、参照整合性、複合キー、一意性制約

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

