平成22年度 春期 午前Ⅱ 問3
データ操作
UNIQUE制約に関する問題
表 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'
答えと解説を見る
✓ これが正解エUPDATE R SET A = 'AA02' WHERE A = 'AA01'
解説
A を AA02 に変えると(AA02,BB01)が 2 行になり重複します。
UNIQUE 制約は、指定した列の値の組合せが表の中で重複しないことを求める制約です。この表では、A と B の 2 列の組合せが一意でなければなりません。UPDATE R SET A = 'AA02' WHERE A = 'AA01' を実行すると、1 行目の(AA01,BB01)は(AA02,BB01)に、2 行目の(AA01,BB02)は(AA02,BB02)に変わります。ところが表にはもともと 3 行目の(AA02,BB01)があるので、同じ組合せが 2 行になり、制約に違反します。UPDATE の問は、書き換えた後の行を一つずつ作ってから、既存の行と組合せが重ならないかを確かめると確実です。
ほかの選択肢はなぜ違うのか
- アDELETE FROM R WHERE …:行を削除しても、残った行の A と B の組合せが新たに重なることはありません。(AA01,BB02)の行がなくなるだけで、一意であるという条件はそのまま保たれます。
- イINSERT INTO R VALUES…:追加する行の A と B は(AA01,NULL)です。表に同じ組合せの行はなく、SQL の UNIQUE 制約では NULL を含む組合せはほかの行と等しいとはみなされないので、重複は生じず制約違反になりません。
- ウINSERT INTO R VALUES…:追加する行は A と B がどちらも NULL です。値が決まっていない組合せはほかの行と等しいとはみなされないので、UNIQUE 制約の違反にはなりません。C と D に入る値は、この制約の判定には関係しません。
出典:平成22年度 春期 データベーススペシャリスト試験 午前Ⅱ 問3
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)