令和7年秋期試験問題 午前Ⅱ 問8

表定義に基づいて作成された"システム担当者"表において,トランザクションAの複合文内のSQL文全てを正常終了させるためにaに入れる字句はどれか。ここで,実線の下線は主キーを表す。

〔表定義〕
CREATE TABLE システム担当者 (
 システム番号 INTEGER,
 担当者番号 INTEGER NOT NULL,
 CONSTRAINT PK_システム番号 PRIMARY KEY(システム番号),
 CONSTRAINT UK_担当者番号 UNIQUE(担当者番号) DEFERRABLE INITIALLY IMMEDIATE
)
08.png
〔トランザクションAの複合文内のSQL文〕
SET CONSTRAINTS a;
UPDATE システム担当者 SET 担当者番号 = 222 WHERE システム番号 = 1234;
UPDATE システム担当者 SET 担当者番号 = 111 WHERE システム番号 = 6789;
COMMIT;

  • PK_システム番号 DEFERRED
  • PK_システム番号 IMMEDIATE
  • UK_担当者番号 DEFERRED
  • UK_担当者番号 IMMEDIATE
正解 問題へ
分野 :テクノロジ系
中分類:データベース
小分類:データ操作
解説
表定義においてCONSTRAINT句の後ろに続く、DEFERRABLE句とINITIALLY句の意味を確認します。これら2つは制約の適用方法とタイミングを指定するものです。
DEFERRABLE
トランザクションでCOMMIT文が発行されるまで、制約の検査を遅延できることを示す(遅延制約)
INITIALLY
DEFERRABLEが付いている制約について、既定の検査時期を次のいずれかで指定する。トランザクション内のSET CONSTRAINT文で上書きが可能
  • IMMEDIATE(即時)- 各SQL文の終了時に検査:デフォルト
  • DEFERRED(遅延)- トランザクションの終了時に検査
表定義を見ると、担当者番号にはUNIQUE制約(UK_担当者番号)が設定されており、その制約の検査方法としてDEFERRABLE INITIALLY IMMEDIATEが指定されています。上記の説明のとおり、DEFERRABLE は「制約検査の遅延が可能」、INITIALLY IMMEDIATE は「即時チェックが既定動作」という意味になります。

トランザクションAの最初のSQL文を実行すると、1行目の担当者番号が"222"に更新され、一時的に"222"の担当者番号が複数行となります。
08_1.png
デフォルト動作のIMMEDIATE(即時)の場合、この時点でUNIQUE制約が評価され、制約違反でロールバックが発生し、トランザクションは正常終了できません。

このようにトランザクションの途中で一時的に制約違反が発生する場合でも、制約検査時期をDEFERRED(遅延)に設定すれば、その時点ではエラーとせず処理を続けることができます。制約"UK_担当者番号"にDEFERREDを設定した場合、1つ目のSQL終了時には制約検査が行われず、トランザクション終了時に検査が行われます。トランザクションを終了時の担当者番号は1行目"222"、2行目"111"となるため、UNIQUE制約に違反せず、正常にトランザクションを完了できます。
08_2.png
以上より、トランザクションAを正常に終了させるためには、SET CONSTRAINTS文の空欄aに「UK_担当者番号 DEFERRED」を入れる必要があります。したがって「ウ」が正解です。

【補足】
本問ではシステム番号の重複は生じないため、PK_システム番号にDEFERRED/IMMEDIATEを付与しても意味がありません。そもそも制約宣言でDEFERRABLEを付けていないPK_システム番号はNOT DEFERRABLE(遅延不可)と扱われるため、SET CONSTRAINT文でDEFERREDを指定しても無視されます。

Pagetop