Crear y gestionar restricciones de comprobación

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() y CURRENT_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