データベーススペシャリスト 2010年 午前2 問03
問題文
表Rに、(A, B)の2列でユニークにする制約(UNIQUE制約)が定義されているとき、表Rに対するSQL文でこの制約の違反となるものはどれか。ここで、表Rには主キーの定義がなく、また、すべての列は値が決まっていない場合(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'(正解)🔒 解説は解答すると表示されます
UNIQUE制約とNULLの扱い【午前2解説】
正解の理由
選択肢エの
具体的には、元々 (AA02, BB01) と (AA01, BB01) が存在し、UPDATE 後に両方が (AA02, BB01) となり UNIQUE 制約違反となります。
他の選択肢はNULLの扱いや削除・挿入で重複を生じさせていないため、制約違反にはなりません。
UPDATE R SET A = 'AA02' WHERE A = 'AA01' は、A列の値を 'AA01' から 'AA02' に変更することで、(A, B) の組み合わせが重複する行が発生します。具体的には、元々 (AA02, BB01) と (AA01, BB01) が存在し、UPDATE 後に両方が (AA02, BB01) となり UNIQUE 制約違反となります。
他の選択肢はNULLの扱いや削除・挿入で重複を生じさせていないため、制約違反にはなりません。
解法ステップ
- UNIQUE 制約の対象列 (A, B) の現在の値の組み合わせを確認する。
- 各選択肢のSQL文が (A, B) の組み合わせにどのような影響を与えるか検討する。
- NULLの扱いを理解し、NULL同士は重複とみなされないことを確認する。
- UPDATE 文で既存の値を変更した場合に重複が生じるかを特に注意して判断する。
- 重複が生じる選択肢を正解とする。
選択肢別の誤答解説
- ア:
DELETE FROM R WHERE A = 'AA01' AND B = 'BB02'
→ 行を削除するため、重複を生むどころか制約違反のリスクを減らす。違反ではない。 - イ:
INSERT INTO R VALUES ('AA01'、NULL, 'DD01'、'EE01')
→ B列がNULLのため、(A, B) の組み合わせは ('AA01'、NULL)。NULLは重複判定に含まれず違反にならない。 - ウ:
INSERT INTO R VALUES (NULL, NULL, 'AA01'、'BB02')
→ (A, B) が (NULL, NULL) であり、NULL同士は重複とみなされないため違反ではない。 - エ:
UPDATE R SET A = 'AA02' WHERE A = 'AA01'
→ (AA01, BB01) の行が (AA02, BB01) に変わり、既存の (AA02, BB01) と重複し UNIQUE 制約違反となる。
よくある誤解
NULL値が UNIQUE 制約の重複判定に影響しないため、NULLを含む挿入は重複とみなされないと誤解しがちです。
また、UPDATE 文での値変更が重複を生む可能性を見落とすことも多いです。
また、UPDATE 文での値変更が重複を生む可能性を見落とすことも多いです。
補足コラム
UNIQUE 制約は、複数列の組み合わせに対して一意性を保証します。
SQL標準ではNULLは「不明な値」として扱われ、NULL同士は等価とみなされず重複判定に含まれません。
そのため、NULLを含む行は複数あっても UNIQUE 制約違反にならない点がポイントです。
一方、UPDATE 文で既存の値を変更し、重複が生じる場合は制約違反となるため注意が必要です。
SQL標準ではNULLは「不明な値」として扱われ、NULL同士は等価とみなされず重複判定に含まれません。
そのため、NULLを含む行は複数あっても UNIQUE 制約違反にならない点がポイントです。
一方、UPDATE 文で既存の値を変更し、重複が生じる場合は制約違反となるため注意が必要です。
FAQ
Q: UNIQUE 制約の列にNULLが含まれていても重複になることはありますか?
A: いいえ。NULLは重複判定に含まれないため、NULLを含む行は複数あっても UNIQUE 制約違反にはなりません。
A: いいえ。NULLは重複判定に含まれないため、NULLを含む行は複数あっても UNIQUE 制約違反にはなりません。
Q: UPDATE 文で UNIQUE 制約違反が起きるのはどんな場合ですか?
A: 既存の行の値を変更して、同じ UNIQUE 制約の列の組み合わせが他の行と重複する場合に違反となります。
A: 既存の行の値を変更して、同じ UNIQUE 制約の列の組み合わせが他の行と重複する場合に違反となります。
関連キーワード: UNIQUE 制約、NULL の扱い、SQL UPDATE, 一意性制約、複合キー

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

