応用情報技術者 2014年 春期 午前2 問25
問題文
SQL文においてFOREIGN KEYとREFERENCESを用いて指定する制約はどれか。
選択肢
ア:キー制約
イ:検査制約
ウ:参照制約(正解)
エ:表明
🔒 解説は解答すると表示されます
参照制約(外部キー)【午前2解説】
正解の理由
SQLでのFOREIGN KEYとREFERENCESは、他の表の行を参照して「参照整合性」を維持するための制約を定義します。したがって選択肢ウが正解です。具体的には、FOREIGN KEY句は外部キー制約を宣言する役割を持ち、REFERENCES句は参照先の親表と列(主キーまたは候補キー=UNIQUE制約付き列)を指定します。
※重要な点として、REFERENCESが参照できるのは「主キー」に限らず、候補キー(UNIQUE制約の付いた列)も対象になります。またREFERENCES句は列レベルでも単独に書いて参照制約を定義できます(必ずFOREIGN KEYとセットでなければならない、という記述は誤りです)。
解法ステップ
- 問題文にあるキーワード(FOREIGN KEY, REFERENCES)を確認する。
- それらが何のために使われるかを想起する(他表を参照して整合性を保つため)。
- 選択肢に当てはめる:参照整合性に直結する語を選ぶ(参照制約)。
- 他の選択肢(キー制約、検査制約、表明)と比較して意味が一致するか検証する。
選択肢別の誤答解説
- ア: キー制約
「キー制約」は主キーやユニーク制約のようにキー自体に関する制約を指します。FOREIGN KEY/REFERENCESは親表のキーを参照するために使うが、制約の本質は「参照(整合性)」であり、単にキーを定義することとは区別されます。 - イ: 検査制約
「検査制約(CHECK)」は列や行の値が特定の条件を満たすかを検証するためのものです。FOREIGN KEY/REFERENCESは表間の参照関係を扱うため一致しません。 - ウ: 参照制約
正解。表間の参照整合性(参照制約/外部キー制約)を表す語です。 - エ: 表明
「表明(ASSERTION)」はSQL標準にある表レベルの制約概念ですが、問題文で示されているFOREIGN KEYとREFERENCESが直接表明を意味するわけではありません。
よくある誤解
- REFERENCESは必ず主キーを参照する
→ 誤り。REFERENCESは親テーブルの主キーだけでなく、候補キー(UNIQUE制約のある列・列組合せ)を参照できます。参照先の列は一意である必要がありますが、必ずしもPRIMARY KEYである必要はありません。 - REFERENCESは常にFOREIGN KEYとセットで書かなければならない
→ 誤り。列定義の中で直接 REFERENCES を書いて参照制約を作ることが可能です(例: col INT REFERENCES parent(col))。一方、テーブル定義の表レベルでは FOREIGN KEY (...) REFERENCES ... の形式で記述します。 - 外部キーの削除時に自動で子も削除される
→ デフォルトはNO ACTION/RESTRICT(削除や更新を拒否)で、ON DELETE/ON UPDATEで明示的にCASCADE等を指定しない限り自動削除は行われません。
補足コラム
参照制約(外部キー制約)はデータベースの参照整合性を保つ基本機能です。よく使われるオプションに ON DELETE と ON UPDATE があり、親表の行が削除・更新されたときの子表側の振る舞いを指定します。代表的な指定は以下です。
- ON DELETE CASCADE / ON UPDATE CASCADE: 親の変更に合わせて子も自動で変更・削除される
- ON DELETE SET NULL: 親削除時に子の該当列をNULLにする(NULLを許容する場合)
- ON DELETE RESTRICT / NO ACTION: 親に対する操作を拒否(デフォルト系)
実際の記述例:
-- 列レベルのREFERENCES(列定義に直接指定)
CREATE TABLE child (
id INT PRIMARY KEY,
parent_id INT REFERENCES parent(id)
);
-- テーブルレベルのFOREIGN KEY
CREATE TABLE child2 (
id INT,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
);
-- 複合キー(親側がUNIQUEまたはPRIMARY KEY)
CREATE TABLE parent (
a INT,
b INT,
UNIQUE (a, b)
);
CREATE TABLE child3 (
a INT,
b INT,
FOREIGN KEY (a, b) REFERENCES parent(a, b)
);
なお、参照先の列数・データ型は外部キー側と整合している必要があります(列数や型が一致すること)。
FAQ
Q: REFERENCESは必ずPRIMARY KEYを参照しますか?
A: いいえ。主キー(PRIMARY KEY)だけでなく、候補キー(UNIQUE制約の付いた列や列組合せ)も参照先にできます。要件は「参照先で一意に識別できること」です。
A: いいえ。主キー(PRIMARY KEY)だけでなく、候補キー(UNIQUE制約の付いた列や列組合せ)も参照先にできます。要件は「参照先で一意に識別できること」です。
Q: FOREIGN KEYとREFERENCESはどちらが制約の本体ですか?
A: 外部キー制約の表現には2通りあります。テーブルレベルでは FOREIGN KEY (...) REFERENCES ... と書きますが、列レベルでは列定義内に直接 REFERENCES を書いて参照制約を作れます。本質的には「参照制約(外部キー制約)」が目的です。
A: 外部キー制約の表現には2通りあります。テーブルレベルでは FOREIGN KEY (...) REFERENCES ... と書きますが、列レベルでは列定義内に直接 REFERENCES を書いて参照制約を作れます。本質的には「参照制約(外部キー制約)」が目的です。
Q: 親テーブルの行を削除すると子テーブルの行は自動で消えますか?
A: デフォルトでは消えません。自動で消したい場合は ON DELETE CASCADE を指定します。指定が無ければ削除は制約違反になり、エラーになります。
A: デフォルトでは消えません。自動で消したい場合は ON DELETE CASCADE を指定します。指定が無ければ削除は制約違反になり、エラーになります。
関連キーワード: 外部キー, 参照整合性, REFERENCES句, FOREIGN KEY, UNIQUE, PRIMARY KEY, ON DELETE CASCADE, 列レベル制約, テーブルレベル制約

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

