Sets the constraint checking modes for the current transaction.
Syntax
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
Description
The SET CONSTRAINTS
command sets the constraint check behavior in the current transaction. IMMEDIATE
constraints are checked at the end of each statement. DEFERRED
constraints are checked only after the transaction is committed. Each constraint
has its own IMMEDIATE
or DEFERRED
mode.
When a constraint is created, one of the following three characteristics is assigned
to the constraint: DEFERRABLE INITIALLY DEFERRED
, DEFERRABLE INITIALLY IMMEDIATE
, or NOT DEFERRABLE
. The third class is always IMMEDIATE
and is not affected by the SET CONSTRAINTS
command. The first two classes start each transaction in the specified mode. You
can use the SET CONSTRAINTS
command to change the behavior of the first two classes in a transaction.
If you specify a list of constraint names, the SET CONSTRAINTS
command changes the modes of the specified constraints. The specified constraints
must be deferrable. If multiple constraints match a specified name, the modes of all
the matching constraints are changed. The SET CONSTRAINTS ALL
command changes the modes of all deferrable constraints.
If the SET
CONSTRAINTS
command changes the mode of a constraint from DEFERRED
to IMMEDIATE
, the new mode has a retroactive effect. During the execution of the SET
CONSTRAINTS
command, all unfinished data changes are checked. These data changes are no longer
checked at the end of the transaction. If a constraint is violated, the SET CONSTRAINTS
command fails and does not change the constraint mode. Therefore, the SET CONSTRAINTS
command can be used to force constraints to be checked at a specific point in a transaction.
The setting of constraint checking modes affects only foreign key constraints. Check and UNIQUE constraints are not deferrable.