外部キーと参照先の指定で分かる制約とは
基本情報技術者試験 平成29年度秋期 午前 問27 / データベース › データベース設計
過去問にチャレンジ
SQL文においてFOREIGN KEYとREFERENCESを用いて指定する制約はどれか。
- ア
キー制約
- イ
検査制約
- ウ
参照制約
- エ
表明
会話形式の解説
講師この問題は、二つの句が何を指定するかを順に確かめると判断できます。まず、FOREIGN KEYは何を指定しますか。
受験者自分の表で外部キーになる列です。ただ、キーという語があるので、キー制約を選びたくなります。
講師では、REFERENCESは何を指定しますか。自分の表の中だけで指定が完結するでしょうか。
受験者参照する相手の表と列を指定します。別の表とのつながりを定めています。
講師そのとおりです。この組合せで定義するのは参照制約です。参照先の表にない値を外部キー列に登録できないようにし、参照整合性を保ちます。
受験者キー制約とは、何を守るかが違うのですか。
講師はい。キー制約はPRIMARY KEY句などで指定し、主キーの値が重複しないことなど、表の中での一意性を守ります。
受験者検査制約も値を確かめるので、参照先に同じ値があるかを調べるものだと思いました。
講師検査制約はCHECK句で指定し、値が「0以上」などの条件を満たすかを確かめます。ほかの表に同じ値があるかを確かめる制約ではありません。
受験者残る表明は、表どうしのつながりを指定する方法ですか。
講師表明はCREATE ASSERTION文で、データベース全体が満たすべき条件を宣言します。表定義の中で外部キーを指定する方法ではありません。
受験者FOREIGN KEYが自分の表の列、REFERENCESが参照先を示すので、答えは参照制約ですね。
講師はい。参照制約は外部キー制約とも呼ばれます。参照されている行を削除・更新するときの動作は、ON DELETEやON UPDATEで指定できることも押さえておきましょう。
まとめ
FOREIGN KEYは自分の表の外部キー列を、REFERENCESは参照先の表と列を指定します。この組合せで定義するのは参照制約で、正解はウです。キー制約はPRIMARY KEY句など、検査制約はCHECK句、表明はCREATE ASSERTION文に対応します。
解答・解説
正解はウです
この問題のテーマ
SQLのCREATE TABLEで、FOREIGN KEYとREFERENCESを組み合わせて指定する整合性制約の名前を問う問題です。
解き方の考え方
まず、2つの句がそれぞれ何を指定するかを確認します。FOREIGN KEYは自分の表で外部キーになる列を指定し、REFERENCESはその列が参照する相手の表と列を指定します。つまり、この組み合わせは「他の表とのつながり」を定めるものです。他の表を参照する制約の名前を選べば答えになります。
選択肢ごとの解説
- ×ア キー制約アのキー制約は、PRIMARY KEY句などで指定します。主キーの値が重複しないことなど、1つの表の中での一意性を守るための制約です。他の表の列を参照する指定ではないので、FOREIGN KEYとREFERENCESの組には当たりません。
- ×イ 検査制約イの検査制約はCHECK句で指定します。列の値が「0以上」などの条件を満たすかを確かめる制約で、他の表に同じ値があるかどうかは確かめません。そのため、本問の2つの句とは対応しません。
- ○ウ 参照制約ウの参照制約は、FOREIGN KEYで外部キー列を、REFERENCESで参照先の表と列を指定して定義します。この制約があると、参照先の表にない値は外部キー列に登録できません。これで表どうしの参照整合性が保たれるので、本問の指定に当てはまります。
- ×エ 表明エの表明も整合性制約の一種ですが、CREATE ASSERTION文で、データベース全体が満たすべき条件として宣言します。表定義の中で外部キーを指定する方法ではないため、本問の答えにはなりません。
補足
参照制約を付けると、参照されている行を参照先の表から削除・更新するときにも制限がかかります。その際の動作は、ON DELETEやON UPDATEにCASCADEやSET NULLなどを書いて指定できます。
POINT
- FOREIGN KEYは外部キーにする列を指定し、REFERENCESは参照先の表と列を指定します。
- FOREIGN KEYとREFERENCESで定義する制約は参照制約で、外部キー制約とも呼ばれます。
- 参照制約は、参照先の表にない値が外部キー列に入るのを防ぎ、参照整合性を保ちます。
- 制約と句は、キー制約がPRIMARY KEYなど、検査制約がCHECK、表明がCREATE ASSERTIONという組み合わせで覚えます。
