SET CONSTRAINTS — establece el momento de comprobación de las restricciones para la transacción actual
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS establece el comportamiento de la
comprobación de restricciones dentro de la transacción actual. Las restricciones
IMMEDIATE se comprueban al final de cada sentencia.
Las restricciones DEFERRED no se comprueban hasta que se
confirma («commit») la transacción. Cada restricción tiene su propio modo
IMMEDIATE o DEFERRED.
Al crearse, una restricción recibe una de tres características:
DEFERRABLE INITIALLY DEFERRED,
DEFERRABLE INITIALLY IMMEDIATE, o
NOT DEFERRABLE. La tercera clase es siempre
IMMEDIATE y no se ve afectada por el comando
SET CONSTRAINTS. Las primeras dos clases inician cada
transacción en el modo indicado, pero su comportamiento puede cambiarse dentro de una
transacción mediante SET CONSTRAINTS.
SET CONSTRAINTS con una lista de nombres de restricciones
cambia el modo de solo esas restricciones (que deben ser todas postergables
[«deferrable»]). Cada nombre de restricción puede estar calificado por esquema.
Si no se especifica un nombre de esquema, se utiliza la ruta de búsqueda de esquemas
actual («search path») para encontrar el primer nombre coincidente.
SET CONSTRAINTS ALL cambia el modo de todas las restricciones
postergables.
Cuando SET CONSTRAINTS cambia el modo de una restricción
de DEFERRED a IMMEDIATE, el nuevo modo
tiene efecto retroactivo: cualquier modificación de datos pendiente que se habría
comprobado al final de la transacción se comprueba, en su lugar, durante la
ejecución del comando SET CONSTRAINTS. Si se viola alguna
de estas restricciones, SET CONSTRAINTS falla (y no cambia el modo
de la restricción). Por lo tanto, SET CONSTRAINTS se puede usar
para forzar la comprobación de restricciones en un punto específico de una transacción.
Actualmente, solo las restricciones de tipo UNIQUE,
PRIMARY KEY, REFERENCES (clave foránea)
y EXCLUDE se ven afectadas por esta configuración. Las restricciones
NOT NULL y CHECK se comprueban siempre de forma
inmediata cuando se inserta o modifica una fila (no al final de la sentencia).
Las restricciones de unicidad y de exclusión que no hayan sido declaradas
DEFERRABLE también se comprueban inmediatamente.
El disparo de los disparadores («triggers») declarados como “disparadores de restricciones” («constraint triggers») también se controla mediante esta configuración; se disparan al mismo tiempo que debe comprobarse la restricción asociada.
Debido a que PostgreSQL no requiere que los nombres de las
restricciones sean únicos dentro de un esquema (sino solo por tabla), es posible
que haya más de una coincidencia para un nombre de restricción especificado.
En este caso, SET CONSTRAINTS actuará sobre todas las coincidencias.
Para un nombre no calificado por esquema, una vez que se encuentra una o más coincidencia
en algún esquema de la ruta de búsqueda, no se buscan los esquemas que aparecen más adelante
en la ruta.
Este comando solo altera el comportamiento de las restricciones dentro de la transacción actual. Si se emite fuera de un bloque de transacción, emite una advertencia y no tiene ningún otro efecto.
Este comando cumple con el comportamiento definido en el estándar SQL, excepto
por la limitación de que, en PostgreSQL, no se aplica a las
restricciones NOT NULL y CHECK. Además,
PostgreSQL comprueba las restricciones de unicidad no postergables
inmediatamente, no al final de la sentencia como sugeriría el estándar.