問7 制約違反になる SQL 文

基本情報​技術者試験 令和8年度 公開問題 科目A、全20問のうちの問7。

出典:令和8年度 基本情報技術者試験 公開問題 科目A 問7(SQL 文と表は原本の組み方を、狭い画面で読めるよう組み直した)

次の SQL 文によって定義され,値が格納されている“商品”表に対して,制約違反で実行エラーとなる SQL 文はどれか。

〔SQL 文〕
CREATE TABLE 商品
(商品コード CHAR(4) PRIMARY KEY, 商品名 VARCHAR(21),
仕入先コード CHAR(4), 仕入単価 INT, 在庫数 INT)
商品
商品コード商品名仕入先コード仕入単価在庫数
A1⁠1⁠1テレビS0⁠0⁠17⁠5,0⁠0⁠00
A2⁠2⁠2デジタルカメラS0⁠0⁠25⁠0,0⁠0⁠05⁠0
A3⁠3⁠3DVDプレーヤNULLNULLNULL
A4⁠4⁠4洗濯機S0⁠0⁠44⁠5,0⁠0⁠02⁠0

表は横に送ると続きが見えます。

  1. アDELETE FROM 商品 WHERE 仕入先コード IS NULL
  2. イINSERT INTO 商品 VALUES ('A5⁠5⁠5', '空気清浄機', 'S0⁠0⁠5', 6⁠0⁠0⁠0⁠0, 5⁠0)
  3. ウUPDATE 商品 SET 商品コード = 'A6⁠6⁠6' WHERE 商品コード = 'A4⁠4⁠4'
  4. エUPDATE 商品 SET 商品コード = 'A7⁠7⁠7' WHERE 在庫数 >= 2⁠0
答えと解説を開く

正解はエです。

商品コードは PRIMARY KEY (主キー) なので、同じ値の行を 2 つ持てません。エの条件 (在庫数が 2⁠0 以上) に当たる行は、A2⁠2⁠2 (5⁠0) と A4⁠4⁠4 (2⁠0) の 2 つです。この 2 行の商品コードをどちらも A7⁠7⁠7 にしようとするので、主キーの重なりで制約違反になります。正解はエです。

ほかの選択肢が違う理由

  • ア仕入先コードが NULL の行 (A3⁠3⁠3) を消すだけです。消す操作で主キーの制約に触れることはありません。
  • イA5⁠5⁠5 はまだ無い商品コードなので、重ならずに追加できます。
  • ウA4⁠4⁠4 の 1 行だけを、まだ無い A6⁠6⁠6 に変えます。重なりは起きません。

仕組み

主キーは、行を 1 つに決めるための列です。重なりと NULL が許されません。

UPDATE は条件に当たる行の全部を変えます。条件に何行当たるかを先に数えると、この種の問題は解けます。在庫数が NULL の A3⁠3⁠3 は、比べた結果が真にならないので当たりません。

この問に出る言葉