令和7年秋期試験問題 午前Ⅱ 問8
問8解説へ
表定義に基づいて作成された"システム担当者"表において,トランザクションAの複合文内のSQL文全てを正常終了させるためにaに入れる字句はどれか。ここで,実線の下線は主キーを表す。
〔表定義〕
〔トランザクションAの複合文内のSQL文〕
〔表定義〕
CREATE TABLE システム担当者 (
システム番号 INTEGER,
担当者番号 INTEGER NOT NULL,
CONSTRAINT PK_システム番号 PRIMARY KEY(システム番号),
CONSTRAINT UK_担当者番号 UNIQUE(担当者番号) DEFERRABLE INITIALLY IMMEDIATE
)
システム番号 INTEGER,
担当者番号 INTEGER NOT NULL,
CONSTRAINT PK_システム番号 PRIMARY KEY(システム番号),
CONSTRAINT UK_担当者番号 UNIQUE(担当者番号) DEFERRABLE INITIALLY IMMEDIATE
)

SET CONSTRAINTS a;
UPDATE システム担当者 SET 担当者番号 = 222 WHERE システム番号 = 1234;
UPDATE システム担当者 SET 担当者番号 = 111 WHERE システム番号 = 6789;
COMMIT;
UPDATE システム担当者 SET 担当者番号 = 222 WHERE システム番号 = 1234;
UPDATE システム担当者 SET 担当者番号 = 111 WHERE システム番号 = 6789;
COMMIT;
- PK_システム番号 DEFERRED
- PK_システム番号 IMMEDIATE
- UK_担当者番号 DEFERRED
- UK_担当者番号 IMMEDIATE
正解 ウ問題へ
分野 :テクノロジ系
中分類:データベース
小分類:データ操作
中分類:データベース
小分類:データ操作
広告
解説
表定義においてCONSTRAINT句の後ろに続く、DEFERRABLE句とINITIALLY句の意味を確認します。これら2つは制約の適用方法とタイミングを指定するものです。
トランザクションAの最初のSQL文を実行すると、1行目の担当者番号が"222"に更新され、一時的に"222"の担当者番号が複数行となります。
デフォルト動作のIMMEDIATE(即時)の場合、この時点でUNIQUE制約が評価され、制約違反でロールバックが発生し、トランザクションは正常終了できません。
このようにトランザクションの途中で一時的に制約違反が発生する場合でも、制約検査時期をDEFERRED(遅延)に設定すれば、その時点ではエラーとせず処理を続けることができます。制約"UK_担当者番号"にDEFERREDを設定した場合、1つ目のSQL終了時には制約検査が行われず、トランザクション終了時に検査が行われます。トランザクションを終了時の担当者番号は1行目"222"、2行目"111"となるため、UNIQUE制約に違反せず、正常にトランザクションを完了できます。
以上より、トランザクションAを正常に終了させるためには、SET CONSTRAINTS文の空欄aに「UK_担当者番号 DEFERRED」を入れる必要があります。したがって「ウ」が正解です。
【補足】
本問ではシステム番号の重複は生じないため、PK_システム番号にDEFERRED/IMMEDIATEを付与しても意味がありません。そもそも制約宣言でDEFERRABLEを付けていないPK_システム番号はNOT DEFERRABLE(遅延不可)と扱われるため、SET CONSTRAINT文でDEFERREDを指定しても無視されます。
- DEFERRABLE
- トランザクションでCOMMIT文が発行されるまで、制約の検査を遅延できることを示す(遅延制約)
- INITIALLY
- DEFERRABLEが付いている制約について、既定の検査時期を次のいずれかで指定する。トランザクション内のSET CONSTRAINT文で上書きが可能
- IMMEDIATE(即時)- 各SQL文の終了時に検査:デフォルト
- DEFERRED(遅延)- トランザクションの終了時に検査
トランザクションAの最初のSQL文を実行すると、1行目の担当者番号が"222"に更新され、一時的に"222"の担当者番号が複数行となります。

このようにトランザクションの途中で一時的に制約違反が発生する場合でも、制約検査時期をDEFERRED(遅延)に設定すれば、その時点ではエラーとせず処理を続けることができます。制約"UK_担当者番号"にDEFERREDを設定した場合、1つ目のSQL終了時には制約検査が行われず、トランザクション終了時に検査が行われます。トランザクションを終了時の担当者番号は1行目"222"、2行目"111"となるため、UNIQUE制約に違反せず、正常にトランザクションを完了できます。

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