【基本情報技術者試験】(令和8年度・科目A・公開問題)「SQL」

IT資格

令和8年度 基本情報技術者試験 科目 A 公開問題

出典:独立行政法人情報処理推進機構(IPA)「基本情報技術者試験 令和8年度 科目A 問7」

答えを確認する

正解は エ です。

基本情報技術者試験の科目Aでは、SQLの「制約」に関する問題が定番として出題される。
今回取り上げるのは、令和8年度の問7である。「制約違反で実行エラーとなるSQL文はどれか」を選ぶ問題で、主キー制約とNULLの扱いを押さえていれば正解できる。

前提知識

主キー制約(PRIMARY KEY)とは

商品コード に指定された PRIMARY KEY は、次の2つを同時に保証する制約である。

  • 一意性:同じ値を持つ行が2つ以上存在してはならない(重複禁止
  • 非NULL:NULLを入れてはならない

したがって、行の追加(INSERT)でも更新(UPDATE)でも、操作の結果として 商品コード が重複したりNULLになったりすれば、制約違反でエラーとなる。

NULLとの比較は「真」にならない

SQLでは、NULLは「値が不明」という状態を表す。NULLを含む比較の結果は真でも偽でもなく、不明(UNKNOWN) となる。WHERE句は結果が「真」の行だけを対象にするため、在庫数 >= 20 のような条件では、在庫数がNULLの行は対象外になる。

なお、NULLかどうかを調べるときは、= NULL ではなく IS NULL を使う。

選択肢を検討しよう

ア 正常に実行できる。

仕入先コードがNULLの行は A333 の1行だけである。この行を削除するだけなので、重複もNULLも発生しない。この表には外部キー制約もないため、削除でエラーになることはない。

イ 正常に実行できる。

追加する商品コード A555 は、既存の A111・A222・A333・A444 のいずれとも重複しない。
列の数(5つ)も、データ型と桁数(CHAR(4) に4文字、VARCHAR(21) に5文字)も問題なし。

ウ 正常に実行できる。

WHERE句で 商品コード = 'A444' を指定しているため、対象は1行だけである。
その商品コードが A666 に変わるが、A666 は既存にはないので重複しない。

エ 正常に実行できない。

まず、WHERE句の条件に合う行を確認しよう。

商品コード在庫数在庫数 >= 20
A1110
A22250
A333NULL不明(対象外)
A44420

対象になるのは A222A4442行である。この2行の商品コードを、どちらも A777 に更新しようとするため、更新後に同じ商品コードの行が2つできてしまう。
これは主キーの一意性に反するので、制約違反でエラーとなる。

解法のポイント

  • UPDATEの対象は1行とは限らない。
    WHERE句に主キー以外の列を使うと、複数行が対象になりうる。その状態で主キーに固定値を代入すれば、重複が生じる。
  • NULLの行は比較条件に含まれない。
    A333 は在庫数がNULLなので、在庫数 >= 20 の対象にはならない。仮にNULLが対象に入るとしても、結論(エがエラー)は変わらないが、対象行の数え方を誤ると別の選択肢に迷いやすい。
  • DELETEで主キー制約違反は起きない。
    行を消しても重複やNULLは生じない。DELETEでエラーになるのは、外部キーで参照されている行を消す場合などである。

制約違反の問題は、このように「対象行を絞り込み、更新後の状態を想像する」手順で解けば、確実に得点できる。

コメント

タイトルとURLをコピーしました