応用情報技術者 2012年 秋期 午前2 問28
問題文
R 表に、(A,B)の2列で一意にする制約 (UNIQUE 制約)が定義されているときR 表に対する SQL文のうち、この制約に違反するものはどれか。ここで、R 表には主キーの定義がなく、また、全ての列は値が決まっていない場合 (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’(正解)
R 表の UNIQUE 制約違反を問う問題【午前2 解説】
要点まとめ
- 結論:選択肢エの UPDATE 文が UNIQUE 制約違反を引き起こします。
- 根拠:UNIQUE 制約は (A, B) の組み合わせが重複しないことを保証し、UPDATE により既存の行と重複が生じます。
- 差がつくポイント:NULL 値の扱いと、INSERT と UPDATE の違いを正確に理解し、制約違反の発生条件を見極めることが重要です。
正解の理由
選択肢エの UPDATE 文は、A 列の値を ‘AA01’ から ‘AA02’ に変更します。
元のデータにはすでに A=‘AA02’ の行が複数存在し、B 列の値も異なるため、(A, B) の組み合わせが重複する可能性があります。
具体的には、UPDATE により (A, B) = (‘AA02’、‘BB01’) の行が複数できてしまい、UNIQUE 制約に違反します。
一方、他の選択肢は NULL の扱いや削除・挿入で制約違反を起こしません。
元のデータにはすでに A=‘AA02’ の行が複数存在し、B 列の値も異なるため、(A, B) の組み合わせが重複する可能性があります。
具体的には、UPDATE により (A, B) = (‘AA02’、‘BB01’) の行が複数できてしまい、UNIQUE 制約に違反します。
一方、他の選択肢は NULL の扱いや削除・挿入で制約違反を起こしません。
よくある誤解
- NULL を含む列は UNIQUE 制約の重複判定から除外されるため、NULL があれば重複しても問題ないと誤解しがちです。
- DELETE 文はデータを削除するため、制約違反を起こすことはありません。
解法ステップ
- UNIQUE 制約の対象列 (A, B) の組み合わせを確認する。
- 各選択肢の SQL 文が (A, B) の組み合わせにどのような影響を与えるか検討する。
- NULL 値の扱いを理解し、NULL 同士は重複とみなされないことを確認する。
- UPDATE 文で既存の (A, B) の組み合わせが重複するかどうかを判断する。
- 制約違反が起きる選択肢を特定する。
選択肢別の誤答解説
- ア: DELETE 文は行を削除するため、制約違反は起きません。
- イ: INSERT 文で B に NULL が入るため、(A, B) の組み合わせは重複しません。
- ウ: INSERT 文で A, B 両方が NULL のため、UNIQUE 制約違反にはなりません。
- エ: UPDATE 文で A の値を ‘AA02’ に変更し、既存の行と (A, B) が重複し、制約違反となります。
補足コラム
UNIQUE 制約は複数列の組み合わせで重複を防ぐため、NULL 値が含まれる場合は重複判定から除外されます。
これは SQL 標準の仕様であり、NULL は「不明な値」として扱われるため、NULL 同士は等しくないと判断されます。
また、主キー制約は NULL を許さず、必ず一意である必要がありますが、今回の表には主キーが定義されていません。
これは SQL 標準の仕様であり、NULL は「不明な値」として扱われるため、NULL 同士は等しくないと判断されます。
また、主キー制約は NULL を許さず、必ず一意である必要がありますが、今回の表には主キーが定義されていません。
FAQ
Q: UNIQUE 制約の対象列に NULL がある場合、重複は許されますか?
A: はい、NULL は重複判定から除外されるため、NULL を含む行は重複しても制約違反になりません。
A: はい、NULL は重複判定から除外されるため、NULL を含む行は重複しても制約違反になりません。
Q: DELETE 文で UNIQUE 制約違反は起きますか?
A: いいえ、DELETE は行を削除するため、制約違反を引き起こすことはありません。
A: いいえ、DELETE は行を削除するため、制約違反を引き起こすことはありません。
Q: UPDATE 文で UNIQUE 制約違反を防ぐにはどうすればよいですか?
A: 更新後の値が既存の行と重複しないように注意し、必要に応じて事前に重複チェックを行うことが重要です。
A: 更新後の値が既存の行と重複しないように注意し、必要に応じて事前に重複チェックを行うことが重要です。
関連キーワード: UNIQUE 制約、NULL の扱い、UPDATE 文、SQL 制約違反、複合一意制約

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

