問題
応用情報技術者平成23年特別 午前問28
“社員扶養家族”表の列”社員番号”の値が”社員”表の候補キーに存在しなければならないという制約はどれか。
- 一意性制約
- 形式制約
- 参照制約
- ドメイン制約
答え
参照制約
解説
RDB Relational Database では、間違って変な値を入力してしまわないように、格納する値に事前に制約を設けることができます。
制約には色々な種類があります。
一意性制約
一意性制約 (いちいせいせいやく、Unique Constraint)とは、データベースにおいてデータを追加、更新する際の制約の一つで、列あるいは列のグループに含まれるデータが、テーブル内のすべての行で一意(「他に同じデータがない」の意味)であることを要求する。なお、この一意性制約にNOT NULL制約を加えたものが主キー制約であると考えることもできる。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
一意性制約とは、列の値に重複がないことを求める制約です。
列を作成する際に UNIQUE
をつけることで、その列には重複した値を入力することができなくなります。
例えば以下のようにテーブルを定義すると、shain_bango
に重複した値を入力することができなくなり、それぞれの社員は自分だけのユニークな番号を持つことになります。
CREATE TABLE shain ( shain_bango INT UNIQUE, name CHAR(16), ) ;
NOT NULL 制約
ただし、一意性制約だけでは、shain_bango
に何も入力しなくとも、新しい社員の行を作成できてしまいます。
そこで、一意性制約に加え、NOT NULL
「何も入力していないのはダメ」という制約を加えることで、必ず値が入力されることを保証します。
CREATE TABLE shain ( shain_bango INT UNIQUE NOT NULL, name CHAR(16), ) ;
主キー制約
また、UNIQUE
と NOT NULL
の組み合わせは主キーに対して良く用いられるので、 PRIMARY KEY
と記述することで同じ規則、つまり一意で NULL でないという規則、を適用することができます。
CREATE TABLE shain ( shain_bango INT PRIMARY KEY, name CHAR(16), ) ;
CHECK制約
CHECK制約 (-せいやく、Check Constraint)とは、データベースにおいてデータを追加、更新する際の有効なデータを定義する規則のことをいう。チェック制約はテーブルの1つの列に複数つけることができ、条件に合う(True)かもしくは合わない(False)のいずれかの値を取る式でなければならない。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
形式制約やドメイン制約は、CHECK制約を用いて実装されます。
CONSTRAINT 規則名 CHECK(規則内容)
と書きます。
形式制約
格納されるデータが一定の形式に従っていることを求める制約です。
LIKE
と正規表現を使って表現します。
例えば以下のように記述すると、社員の携帯番号は 080-0000-0000 または 090-0000-0000 という入力に限定することができます。
CREATE TABLE shain ( shain_bango INT PRIMARY KEY, name CHAR(16), cell_phone_num CHAR(14), CONSTRAINT chell_phone_check CHECK(cell_phone_num LIKE '0[89]0-[0-9]{4}-[0-9]{4}') ) ; ) ;
ドメイン制約
格納されるデータの定義域に対する制約です。
例えば以下のように記述すると、社員の年齢は15以上65以下の整数値しか入力できません。
CREATE TABLE shain ( shain_bango INT PRIMARY KEY, name CHAR(16), age INT, CONSTRAINT age_check CHECK(age>=15 AND age<=65) ) ;
参照制約
外部キー(がいぶキー、英語:foreign key、FK)は、コンピュータの関係データベースの関係モデルの文脈において、2つの関係変数(表)の間の参照整合性制約をいう。 外部キーは、参照する側の関係変数で1つの属性(列、カラム)もしくは2つ以上の属性の集合を同定し、参照する側の関係変数は、参照される側の関係変数の1つの属性もしくは2つ以上の属性の集合を参照する。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
外部参照を設定する際に用いられる制約で、格納される値が参照先の表中に必ず存在することを求めます。
FOREIGN KEY (列名) REFERENCES 参照先テーブル名(列名)
と書きます。
例えば、以下のように表を作ると、shain_fuyo_kazoku
表の shain_bango
は shain
表の shain_bango
に存在しない値を入力することができなくなります。
CREATE TABLE shain ( shain_bango INT PRIMARY KEY, name CHAR(16), ) ; CREATE TABLE shain_fuyo_kazoku ( fuyo_id INT PRIMARY KEY, name CHAR(16), zokugara CHAR(8), shain_bango INT, FOREIGN KEY (shain_bango) REFERENCES shain(shain_bango) ) ;