平成24年度 秋期 応用情報技術者試験 午前 問28
テクノロジ/データベースR表に,(A,B)の2列で一意にする制約(UNIQUE制約)が定義されているとき,R表に対するSQL文のうち,この制約に違反するものはどれか。ここで,R表には主キーの定義がなく,また,全ての列は値が決まっていない場合(NULL)もあるものとする。 R表のタプル:('AA01','BB01','CC01','DD01'),('AA01','BB02','CC02',NULL),('AA02','BB01',NULL,'DD03'),('AA02','BB03',NULL,NULL) (注:本サイトでは原問題の表を文字表記に変換しています)
出典:平成24年度 秋期 応用情報技術者試験 午前 問28
- アDELETE FROM R WHERE A = 'AA01' AND B = 'BB02'
- イINSERT INTO R(A, B, C, D) VALUES ('AA01', NULL, 'DD01', 'EE01')
- ウINSERT INTO R(A, B, C, D) VALUES (NULL, NULL, 'AA01', 'BB02')
- エUPDATE R SET A = 'AA02' WHERE A = 'AA01'
正解:エ
解説
R表には(A,B)のUNIQUE制約があり,NULLは互いに異なる値として扱われるため,NULLを含む(A,B)の組合せは制約に違反しません。UPDATE文はA='AA01'の2行((AA01,BB01)と(AA01,BB02))をA='AA02'に更新するため,更新後は(AA02,BB01)と(AA02,BB02)ができ,既存の(AA02,BB01)と重複してしまい,UNIQUE制約に違反します。
選択肢ごとの解説
- ア誤り。DELETE文は行を削除するだけであり,(A,B)の重複を生じさせないため制約に違反しません。
- イ誤り。挿入される(A,B)=('AA01',NULL)は,Bの値がNULLのため既存の('AA01','BB01')や('AA01','BB02')とは重複せず,制約に違反しません。
- ウ誤り。挿入される(A,B)=(NULL,NULL)は,既存のどの行の(A,B)とも一致しないため,制約に違反しません。
- エ正しい。A='AA01'の2行を'AA02'に更新すると,既存の('AA02','BB01')と重複する(A,B)の組合せが生じ,UNIQUE制約に違反します。