基本情報技術者 2026年 科目A 問07
問題文
次のSQL文によって定義され、値が格納されている“商品”表に対して、制約違反で実行エラーとなるSQL文はどれか。
〔SQL文〕
CREATE TABLE 商品
(商品コード CHAR(4) PRIMARY KEY, 商品名 VARCHAR(21),
仕入先コード CHAR(4), 仕入単価 INT, 在庫数 INT)

選択肢
ア:DELETE FROM 商品 WHERE 仕入先コード IS NULL
イ:INSERT INTO 商品 VALUES ('A555', '空気清浄機', 'S005', 60000, 50)
ウ:UPDATE 商品 SET 商品コード = 'A666' WHERE 商品コード = 'A444'
エ:UPDATE 商品 SET 商品コード = 'A777' WHERE 在庫数 >= 20(正解)
🔒 解説は解答すると表示されます
主キー一意性制約【午前解説】
正解の理由
この問題では、商品コードが主キー(PRIMARY KEY)として定義されています。主キーは「NULL不可かつ重複不可(一意)」が要件です。選択肢のうち、エのSQL文は WHERE 節に合致する複数行(在庫数が50の行と20の行、つまり商品コード A222 と A444)を同じ値 'A777' に更新しようとします。結果として同じ主キー値が複数行に現れ、主キーの一意性制約に違反して実行エラーになります。
解法ステップ
- 定義を確認:商品コード CHAR(4) が PRIMARY KEY → NULL不可、重複不可。
- データを確認:在庫数の値が 0, 50, NULL, 20 の4行がある。
- 各選択肢がどの行に影響するかを判定:WHERE 節やVALUESの値から対象行を特定する。
- 更新・挿入・削除後に主キー制約(NULLか重複)に違反するかを評価する。
- 評価の結果、複数行を同一の主キー値にする エ が制約違反となる。
選択肢別の誤答解説
- ア: DELETE FROM 商品 WHERE 仕入先コード IS NULL
- 仕入先コードが NULL の行(商品コード A333)を削除するだけで、主キーの一意性や NULL 制約を破る操作ではありません。問題なし。
- イ: INSERT INTO 商品 VALUES ('A555', '空気清浄機', 'S005', 60000, 50)
- 挿入する商品コード 'A555' は既存データに無く、NULLでもないため主キー制約には違反しません(重複なし)。問題なし。
- ウ: UPDATE 商品 SET 商品コード = 'A666' WHERE 商品コード = 'A444'
- WHERE により対象は A444 の1行のみで、'A666' が既に存在しなければ重複にはなりません。問題なし。
- エ: UPDATE 商品 SET 商品コード = 'A777' WHERE 在庫数 >= 20
- 在庫数が 50(A222)と 20(A444)の両方が対象となり、双方が同じ 'A777' になるため主キーの重複が発生し、制約違反でエラーになります。
よくある誤解
- 「重複になるのは既存に同じ値がある場合だけ」と考える誤解:更新で複数行を同じ値にすると、その更新操作自体で重複が生じます(既存になくても違反)。
- 「>= 20 は 20 を含まない」との誤解:
>=は 20 を含むため、在庫数20の行も対象になります。 - 「PRIMARY KEY は NULL を許す」との誤解:主キーは NULL を許しません。NULL 挿入や更新は制約違反になります。
補足コラム
DBMS によっては制約のチェックタイミングや「遅延制約(DEFERRABLE)」の扱いが異なります。標準的な環境(多くの設定)では主キー制約は即時にチェックされ、同一トランザクション内で複数行を同じ主キー値にする更新はエラーになります。もし複数行のキーを入れ替える必要がある場合は、一時値を使う、CASE 式で値を分けて更新する、あるいは制約を遅延(デファラブル)に設定してから更新を行う方法があります。
例:A と B の主キーを入れ替える(簡易イメージ)
-- 一時値を使う例(擬似)
UPDATE 商品 SET 商品コード = 'TEMP' WHERE 商品コード = 'A111';
UPDATE 商品 SET 商品コード = 'A111' WHERE 商品コード = 'A222';
UPDATE 商品 SET 商品コード = 'A222' WHERE 商品コード = 'TEMP';
FAQ
Q. 「複数行を同じ値に更新すると必ずエラーですか?」
A. 主キーや一意制約のある列に対して複数行を同じ値にすると、重複が生じてエラーになります(ただし、制約が遅延評価される特殊設定や、そもそも一意制約がない場合は別)。
A. 主キーや一意制約のある列に対して複数行を同じ値にすると、重複が生じてエラーになります(ただし、制約が遅延評価される特殊設定や、そもそも一意制約がない場合は別)。
Q. 「NULL を主キーにできるか?」
A. 一般に主キーは NULL を許さない設計です。NULL を許す必要がある場合は主キーの代わりにユニーク制約など設計を見直します。
A. 一般に主キーは NULL を許さない設計です。NULL を許す必要がある場合は主キーの代わりにユニーク制約など設計を見直します。
Q. 「今回のケースでトランザクション内なら衝突を回避できるか?」
A. デフォルト設定では回避できません。PostgreSQL 等で制約を DEFERRABLE に設定し、トランザクションの最後にチェックするようにすれば一時的な重複を許すことは可能ですが、標準試験問題では即時チェックが前提です。
A. デフォルト設定では回避できません。PostgreSQL 等で制約を DEFERRABLE に設定し、トランザクションの最後にチェックするようにすれば一時的な重複を許すことは可能ですが、標準試験問題では即時チェックが前提です。
関連キーワード: 主キー、主キー制約、一意性制約、NULL不可、UPDATE文、WHERE句、重複エラー、デファラブル制約

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

