表 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'
(正解)
解説
表 R に (A, B) の UNIQUE 制約があるときの制約違反SQL【午前2 解説】
要点まとめ
- 結論:表 R の (A, B) 列に UNIQUE 制約があるため、これらの組み合わせが重複すると制約違反となる。
- 根拠:UNIQUE 制約は NULL を含む場合、NULL 同士は重複とみなさないが、値が決まっている組み合わせは重複不可。
- 差がつくポイント:NULL の扱いと、UPDATE による既存行の値変更で重複が生じるケースを正しく理解すること。
正解の理由
選択肢エの
UPDATE R SET A = 'AA02' WHERE A = 'AA01'
は、A列の値を 'AA01' から 'AA02' に変更することで、(A, B) の組み合わせが重複する行が発生します。
具体的には、元々 (AA02, BB01) と (AA01, BB01) が存在し、UPDATE 後に両方が (AA02, BB01) となり UNIQUE 制約違反となります。
他の選択肢は NULL の扱いや削除・挿入で重複を生じさせていないため、制約違反にはなりません。
よくある誤解
NULL 値が UNIQUE 制約の重複判定に影響しないため、NULL を含む挿入は重複とみなされないと誤解しがちです。
また、UPDATE 文での値変更が重複を生む可能性を見落とすことも多いです。
解法ステップ
- 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 制約違反となる。
補足コラム
UNIQUE 制約は、複数列の組み合わせに対して一意性を保証します。
SQL 標準では NULL は「不明な値」として扱われ、NULL 同士は等価とみなされず重複判定に含まれません。
そのため、NULL を含む行は複数あっても UNIQUE 制約違反にならない点がポイントです。
一方、UPDATE 文で既存の値を変更し、重複が生じる場合は制約違反となるため注意が必要です。
FAQ
Q: UNIQUE 制約の列に NULL が含まれていても重複になることはありますか?
A: いいえ。NULL は重複判定に含まれないため、NULL を含む行は複数あっても UNIQUE 制約違反にはなりません。
Q: UPDATE 文で UNIQUE 制約違反が起きるのはどんな場合ですか?
A: 既存の行の値を変更して、同じ UNIQUE 制約の列の組み合わせが他の行と重複する場合に違反となります。
関連キーワード: UNIQUE 制約, NULL の扱い, SQL UPDATE, 一意性制約, 複合キー