SET CONSTRAINTS

SET CONSTRAINTS — establece el momento de comprobación de las restricciones para la transacción actual

Synopsis

SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

Descripción

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.

Notas

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.

Compatibilidad

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.