SET CONSTRAINTSは、現在のトランザクションにおける制約の検査方法を設定します。 IMMEDIATE制約は、一つの文の実行が終わる毎に検査されます。 DEFERRED制約は、トランザクションがコミットされるまで検査されません。 各制約は個別にIMMEDIATEかDEFERREDかどちらかのモードを持ちます。
制約はその生成時において、DEFERRABLE INITIALLY DEFERRED、DEFERRABLE INITIALLY IMMEDIATE、NOT DEFERRABLEの三つのうちのいずれかの特性を持ちます。 三番目のものは、常にIMMEDIATEであり、SET CONSTRAINTSコマンドで有効になりません。 初めの二つは、全てのトランザクションを指定したモードで開始しますが、トランザクション内でSET CONSTRAINTSを使用してその振舞いを変更することができます。
制約名のリストを持ったSET CONSTRAINTSは、それらの制約のモードのみを変更します。 (これらは全て遅延可能でなければなりません。) 指定した名前に一致する制約が複数存在した場合、その全てが影響を受けます。 SET CONSTRAINTS ALLは遅延可能な制約全てに対してそのモードを変更します。
制約のモードをDEFERREDからIMMEDIATEに変更した場合は、新しい制約モードが遡及的に有効になります。 つまり(DEFERREDを使用している場合には)トランザクションの終了時に検査されることになる未検査のデータ変更が、代わりにSET CONSTRAINTSコマンドの実行中に検査されます。 もし、この時に何らかの制約違反があった場合、SET CONSTRAINTSは失敗します。 (そして、制約モードは変更されません。) 従って、SET CONSTRAINTSを使用して、トランザクションの特定の時点で制約の検査を強制的に実行することができます。
今のところ、外部キーの制約だけがこの設定の影響を受けます。 検査制約や一意性制約は、常に遅延されません。
このコマンドは、現在のトランザクション内のみの制約の動作を変更します。 したがって、トランザクションブロック(BEGIN/COMMITの間)の外部でこのコマンドを実行した場合、全く影響を与えません。