表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 = 'BB02' |
イ |
INSERT INTO R VALUES ( 'AA01', NULL, 'DD01', 'EE01' ) |
ウ |
INSERT INTO R VALUES ( NULL, NULL, 'AA01', 'BB02' ) |
エ |
UPDATE R SET A = 'AA02' WHERE A = 'AA01' |
答え エ
【解説】
それぞれの操作を行った後の表を求めてみる。
ア |
DELETE FROM R WHERE A = 'AA01' AND B = 'BB02'
A |
B |
C |
D |
|
AA01 |
BB01 |
CC01 |
DD01 |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
2行目のレコードが削除されますが、ユニーク制約は保たれています。 |
イ |
INSERT INTO R VALUES ( 'AA01', NULL, 'DD01', 'EE01' )
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 VALUES ( NULL, NULL, 'AA01', 'BB02' )
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 = 'AA02' WHERE A = 'AA01'
A |
B |
C |
D |
|
AA02 |
BB01 |
CC01 |
DD01 |
AA02 |
BB02 |
CC02 |
NULL |
AA02 |
BB01 |
NULL |
DD03 |
AA02 |
BB03 |
NULL |
NULL |
1行目と2行目もレコードの“AA01”が“AA02”に変更され、1行目と3行目のレコードが区別を付けることができなくなり、ユニーク制約に違反します。 |
【キーワード】
・UNIQUE制約
【キーワードの解説】
- UNIQUE制約(一意性制約)
データベースの表において、データの組(行)で見たときに表中に同じデータがなく、ユニーク(一意)にデータを特定できるような制約を、データの追加、更新時に課する制約です。
なお、主キーがある表では、主キーの値はユニーク制約になっています。
もっと、「UNIQUE制約」について調べてみよう。
戻る
一覧へ
次へ
|