R表に、(A, B)の2列で一意にする制約(UNIQUE制約)が定義されているとき、R表に対するSQL文のうち、この制約に違反するものはどれか。
ここで、R表には主キーの定義がなく、また、全ての列は値が決まっていない場合(NULL)もあるものとする。
R
A |
B |
C |
D |
AA01 |
BB01 |
CC01 |
DD01 |
AA01 |
BB02 |
CC02 |
NULL |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
|
ア |
DELETE FROM R WHERE A = ‘AA01’ AND B = ‘BBO2’ |
イ |
INSERT INTO R(A, B, C, D) VALUES (‘AAO1’, NULL, ‘DDO1’, ‘EE0l’) |
ウ |
INSERT INTO R(A, B, C, D) VALUES (NULL, NULL, ‘AAO1’, ‘BB02’) |
エ |
UPDATE R SET A = ‘AAO2’ WHERE A = ‘AAO1’ |
答え エ
【解説】
ア |
DELETE FROM R WHERE A = ‘AA01’ AND B = ‘BBO2’は、表の3行目を削除するSQL文であるが、これを行ってもUNIQUE制約には違反しない。
A |
B |
C |
D |
AA01 |
BB01 |
CC01 |
DD01 |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
|
イ |
INSERT INTO R(A, B, C, D) VALUES (‘AAO1’, NULL, ‘DDO1’, ‘EE0l’)は、データの追加を行うSQL文であるが、これを行ってもUNIQUE制約には違反しない。
A |
B |
C |
D |
AA01 |
BB01 |
CC01 |
DD01 |
AA01 |
BB02 |
CC02 |
NULL |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
AA01 |
NULL |
DD01 |
EE01 |
|
ウ |
INSERT INTO R(A, B, C, D) VALUES (NULL, NULL, ‘AAO1’, ‘BB02’)は、データの追加を行うSQL文であるが、これを行ってもUNIQUE制約には違反しない。
A |
B |
C |
D |
AA01 |
BB01 |
CC01 |
DD01 |
AA01 |
BB02 |
CC02 |
NULL |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
NULL |
NULL |
AA01 |
BB02 |
|
エ |
UPDATE R SET A = ‘AAO2’ WHERE A = ‘AAO1’を行うと、表の2行目と4行目のAとBが同じ値になり、UNIQUE制約に違反します。
A |
B |
C |
D |
AA02 |
BB01 |
CC01 |
DD01 |
AA02 |
BB02 |
CC02 |
NULL |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
|
【キーワード】
・整合性制約
【キーワードの解説】
- 整合性制約
データベースを常に正しい状態に保つために規則です。
整合性制約には、
- 一意性制約
追加、更新する際、列あるいは列のグループに含まれるデータが、テーブル内のすべての行で一意でなければならない。
- 参照制約
複数のテーブルを利用して他のテーブルの値を参照する場合、参照するタプルが必ず存在しなければならない。
- 定義域制約
属性の値が原子値(これ以上細分化できない単純な値)でなければならない。
- 表検査制約
データ挿入又は更新時に条件を満たさないデータの場合は操作を抑止しなければならない。
などがあります。
もっと、「整合性制約」について調べてみよう。
戻る
一覧へ
次へ
|