遅延制約とは?ちえんせいやく
遅延制約とは、制約の検査をSQL文の実行ごとではなく、トランザクションのコミット時点まで先送りする指定。途中の状態が一時的に制約を破っても、最終状態さえ正しければ通る。DEFERRABLEとして定義した制約に対し、SET CONSTRAINTS で DEFERRED に切り替えて使う。
最終更新:2026-10-06
この語が出る過去問を解く →背景
文単位で検査すると、どう順序を工夫しても通せない更新がある。互いを外部キーで参照し合う2つの表は、どちらを先に挿入しても相手がまだ存在しない。一意な2行の値の入れ替えも、途中で必ず重複が生じる。整合性を「各文の後」ではなく「トランザクションの終わり」で見る、という緩め方でこれを解いている。
具体例
座席番号を入れ替える2本のUPDATEは、途中で同じ番号が2行に並ぶため一意制約に触れる。PostgreSQLで制約を DEFERRABLE INITIALLY DEFERRED としておけば、コミット時点の最終状態だけが検査され、入れ替えが通る。
試験での引っ掛け
遅延できるのはDEFERRABLE指定で定義された制約だけで、NOT DEFERRABLEの制約は必ず文単位で検査される。遅延するとエラーの発生箇所がコミット時になるため、どのSQLが原因だったかを追いにくくなる副作用もある。
関連用語
出た過去問
出典:令和7年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8(IPA)
表定義に基づいて作成された"システム担当者"表において、トランザクションAの複合文内のSQL文全てを正常終了させるためにaに入れる字句はどれか。ここで、実線の下…
正解:UK_担当者番号 DEFERRED
要点:値の入替えは制約をDEFERREDにして検査を先送りする
2件の担当者番号を入れ替える更新では、1件目を更新した時点で他方と値が重複してしまう。この表の一意性制約はDEFERRABLEで宣言されているので、SET CONSTRAINTSで検査タイミングをDEFERREDに切り替えれば、検査がコミット時まで先送りされる。2件目の更新が終わった時点では重複が解消しているため、両方のUPDATEが正常終了する。主キー側は宣言にDEFERRABLEが付いておらず、遅延指定の対象にできない。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。