平成24年度 秋期 午前 問28
データベース
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(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'
答えと解説を見る
✓ これが正解エUPDATE R SET A = 'AA02' WHERE A = 'AA01'
解説
A と B の組が既にあるかだけを見ます。
この設問で見るべきなのは A と B の二列の組だけで、C と D は制約に一切関わりません。まず現在の表から使用済みの組を書き出し、そのうえで各 SQL 文が新たに加える組や書き換える組をひとつずつ当て、使用済みとぶつかるかどうかを見ます。ここで効いてくる性質が二つあります。ひとつは、行が減る方向の操作では新しい組が持ち込まれないこと。もうひとつは、UNIQUE 制約は NULL どうしを同じ値として扱わないことです。値が決まっていないものは比較できないため、片方または両方が NULL である組は、既存のどの組とも同じとは判定されません。違反するのは、A の値を一括して書き換える更新です。条件に当てはまる行が二行あり、両方の A が同じ値へ変わるので、片方が既存の組と重なってしまいます。更新は複数の行が一度に動きますから、一行目だけを見て終わらせず、動いた行を全部書き出してください。一行でもぶつかれば、その SQL 文は違反します。
ほかの選択肢はなぜ違うのか
- アDELETE FROM R WHERE …:条件に合う行を削除する文です。削除で表から行が取り除かれても、使用済みの組が増えるわけではありません。増えない以上、二列の一意性が破られることはありません。
- イINSERT INTO R(A, B, …:A に値を、B に値の決まっていない状態を与えて追加する文です。片方が比較できないので既存のどれとも同じにはなりません。A の値だけが重なって見えるのが罠です。
- ウINSERT INTO R(A, B, …:A と B の両方に値の決まっていない状態を与えて追加する文です。二列とも比較できないので通ります。C と D に表と同じ見た目の値が入っていますが、制約が見るのは前の二列だけです。
出典:平成24年度 秋期 応用情報技術者試験 午前 問28(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)