Una restricción CHECK
le permite especificar que los valores de una o varias columnas deben cumplir una expresión booleana. En esta página, se describe cómo añadir y gestionar este tipo de restricción en bases de datos con dialecto GoogleSQL y PostgreSQL.
Añadir una restricción CHECK a una tabla nueva
En el siguiente fragmento de código CREATE TABLE
, creamos una tabla para almacenar información
sobre conciertos.
Para exigir que la hora de finalización de un concierto sea posterior a la de inicio, incluimos una restricción de comprobación.
GoogleSQL
CREATE TABLE Concerts (
ConcertId INT64,
StartTime Timestamp,
EndTime Timestamp,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);
PostgreSQL
CREATE TABLE Concerts (
ConcertId BIGINT,
StartTime TIMESTAMPTZ,
EndTime TIMESTAMPTZ,
CONSTRAINT start_before_end CHECK(StartTime < EndTime),
PRIMARY KEY (ConcertId)
);
La definición de la restricción empieza con la palabra clave CONSTRAINT
. Hemos asignado el nombre start_before_end
a la restricción de forma explícita en este ejemplo para ayudarte a encontrarla en los mensajes de error y cuando necesitemos hacer referencia a ella. Si no se proporciona ningún nombre, Spanner asigna uno, que empieza por el prefijo CK_
. Los nombres de las restricciones se limitan al esquema, junto con los nombres de las tablas y los índices, y deben ser únicos en el esquema. La definición de la restricción check
consta de la palabra clave CHECK
seguida de una expresión
entre paréntesis. La expresión solo puede hacer referencia a columnas de esta tabla. En este ejemplo, se hace referencia a StartTime y EndTime, y la restricción de comprobación se asegura de que la hora de inicio de un concierto sea siempre anterior a la hora de finalización.
El valor de la expresión de la restricción de comprobación se evalúa cuando se inserta una fila nueva o cuando se actualizan los valores de StartTime
o EndTime
de una fila. Si la expresión se evalúa como TRUE
o NULL
, la restricción de comprobación permite el cambio de datos. Si la expresión se evalúa como FALSE
, no se permite el cambio de datos.
Se aplican las siguientes restricciones a un término de restricción de comprobación
expression
.La expresión solo puede hacer referencia a columnas de la misma tabla.
La expresión debe hacer referencia a al menos una columna no generada, ya sea directamente o a través de una columna generada que haga referencia a una columna no generada.
La expresión no puede hacer referencia a columnas que tengan definida la opción
allow_commit_timestamp
.La expresión no puede contener subconsultas.
La expresión no puede contener funciones no deterministas, como
CURRENT_DATE()
yCURRENT_TIMESTAMP()
.
Añadir una restricción CHECK a una tabla
Con la siguiente instrucción ALTER TABLE
, añadimos una restricción para asegurarnos de que todos los IDs de concierto sean mayores que cero.
ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);
Una vez más, hemos asignado un nombre a la restricción: concert_id_gt_0. Si añades una restricción CHECK
a una tabla, se empezará a aplicar inmediatamente a los datos nuevos y se iniciará una operación de larga duración para validar que los datos ya existentes cumplen la nueva restricción. Como esta validación se lleva a cabo como una operación de larga duración, las transacciones en curso de la tabla no se ven afectadas. Para obtener más información, consulta Rendimiento de las actualizaciones de esquemas. Si hay alguna infracción en los datos, la restricción se revierte.
Quitar una restricción CHECK
La siguiente instrucción DDL elimina una restricción CHECK
de la tabla Concerts
.
ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;
Modificar una expresión de restricción CHECK
No se permite modificar la expresión de una restricción CHECK
. En su lugar, debe eliminar la restricción y crear una nueva con la expresión actualizada.
Ver las propiedades de una restricción CHECK
INFORMATION_SCHEMA de Spanner contiene información sobre las restricciones CHECK de tu base de datos. A continuación, se incluyen algunos ejemplos de las preguntas a las que puedes responder consultando el esquema de información.
¿Qué restricciones CHECK se han definido en mi base de datos?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'CHECK';
¿Cuál es el estado actual de las restricciones CHECK de mi base de datos?
Si has añadido una restricción CHECK a una tabla, puede que quieras ver su estado actual para determinar, por ejemplo, si todos los datos se han validado con respecto a la restricción. Si SPANNER_STATE
devuelve
VALIDATING_DATA
en la siguiente consulta, significa que
Spanner aún está validando los datos
con esa restricción.
SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;
Siguientes pasos
- Consulta más información sobre el INFORMATION SCHEMA de Spanner.