基本情報技術者 2010年 秋期 午前(科目A) 問31
問題文
“商品”表に対してデータの更新処理が正しく実行できるUPDATE文はどれか。ここで、“商品”表は次のCREATE文で定義されている。
CREATE TABLE 商品
(商品番号 CHAR(4), 商品名 CHAR(20), 仕入先番号 CHAR(6), 単価 INT, PRIMARY KEY(商品番号))

選択肢
ア:UPDATE 商品 SET 商品番号 = 'S001' WHERE 商品番号 = 'S002'
イ:UPDATE 商品 SET 商品番号 = 'S006' WHERE 商品名 = 'C'
ウ:UPDATE 商品 SET 商品番号 = NULL WHERE 商品番号 = 'S002'
エ:UPDATE 商品 SET 商品名 = 'D' WHERE 商品番号 = 'S003'(正解)
“商品”表のUPDATE文の正否【午前2 解説】
要点まとめ
- 結論: 正解は エ。商品番号(主キー)を変更せず商品名のみ更新するため、一意性やNULL制約を侵害せず正しく実行できる。
- 根拠: CREATE文で商品番号がPRIMARY KEYになっており主キーは一意かつNULL不可なので、主キーに重複やNULLを作る更新は失敗する。
- 差がつくポイント: UPDATEで主キーを変更する際は既存のキーと重複しないか、複数行を同一値に更新して一意性違反にならないか必ず確認する習慣が合格者と差を生む。
正解の理由
選択肢エは「UPDATE 商品 SET 商品名 = 'D' WHERE 商品番号 = 'S003'」で、主キーである商品番号を保持したまま商品名という非キー列だけを更新しています。主キーの一意性やNULL制約に抵触せず、WHEREで対象行が一意に特定できているため安全かつ正しい更新文です。
よくある誤解
- 主キーを更新すれば必ず成功すると思い込み、既存のキーと重複する可能性を見落とす。重複があると一意性制約違反で更新はロールバックされる。
- PRIMARY KEY 列にはNULLが入ると思ってしまう誤解。ほとんどのDBではPRIMARY KEYは暗黙的にNOT NULLになるためNULL代入はエラーになる。
- WHERE句の条件が複数行に該当する場合でも同じ値に更新してよいと考える誤り。複数行を同一の主キー値にすると一意制約違反になる。
解法ステップ
- CREATE TABLE定義から制約を確認する(商品番号がPRIMARY KEY → 一意かつNOT NULL)。
- 各選択肢が主キー(商品番号)を変更するか・NULLを代入するかを判定する。
- 主キーを変更する場合、更新後に同一の主キー値が重複していないか、複数行を同一値に更新していないかを検証する。
- 非キー列のみを更新し、WHEREで対象行が一意に絞れている選択肢を正解とする。
選択肢別の誤答解説
- ア: UPDATE 商品 SET 商品番号 = 'S001' WHERE 商品番号 = 'S002'
→ 商品番号を'S001'に変更すると既に存在する'S001'と重複し、一意制約違反で更新は失敗する。 - イ: UPDATE 商品 SET 商品番号 = 'S006' WHERE 商品名 = 'C'
→ 商品名='C'は2行(S004, S005)に該当するため、両行を同じ商品番号'S006'にすると主キー重複でエラーになる。 - ウ: UPDATE 商品 SET 商品番号 = NULL WHERE 商品番号 = 'S002'
→ PRIMARY KEY列にNULLを代入するのは許されない(NOT NULL制約)ためエラーになる。 - エ: UPDATE 商品 SET 商品名 = 'D' WHERE 商品番号 = 'S003'
→ 商品名という非キー列の更新で、主キーやNULL制約に触れず、該当行が一意に特定されているため正しく実行できる。
補足コラム
- PRIMARY KEY は一般に一意制約(UNIQUE)と NOT NULL を伴います。DBMSによっては明示的にNOT NULLを指定しなくても主キー列はNULL不可になります。
- UPDATEを行う前に必ず該当行をSELECTで確認すると安全です。トランザクションを使い、問題があればROLLBACKできるようにしておくと運用上のリスクを下げられます。
- 複数行を異なる新しい一意値で更新する必要がある場合は、一時列を使った移行やアプリ側でマッピングを作成してから更新する方法が有効です。
FAQ
Q1: 主キーをUPDATEで変更すること自体は可能ですか?
A1: 技術的には可能ですが、更新後に一意性やNULL制約を破らないことが必須です。違反すると更新は失敗します。
A1: 技術的には可能ですが、更新後に一意性やNULL制約を破らないことが必須です。違反すると更新は失敗します。
Q2: WHERE句を省略してUPDATEするとどうなる?
A2: 全行が対象になり、意図しない大量更新や一意性違反を招くため、実運用では避けるべきです。必ず条件を確認してください。
A2: 全行が対象になり、意図しない大量更新や一意性違反を招くため、実運用では避けるべきです。必ず条件を確認してください。
Q3: 同じ値で複数行の主キーを更新したらどうなる?
A3: 主キーの一意制約に違反するため、多くのDBでは最初の違反でエラーになり全更新がロールバックされます。
A3: 主キーの一意制約に違反するため、多くのDBでは最初の違反でエラーになり全更新がロールバックされます。
Q4: 安全にUPDATEを行うチェックリストは?
A4: 1) WHEREで対象が想定通りかSELECTで確認、2) 主キー・一意制約・NULL制約を確認、3) トランザクションで囲む、4) バックアップを確保。
A4: 1) WHEREで対象が想定通りかSELECTで確認、2) 主キー・一意制約・NULL制約を確認、3) トランザクションで囲む、4) バックアップを確保。
関連キーワード: UPDATE、主キー、一意制約、NULL制約、WHERE句、トランザクション、SQL、データ整合性

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

