Crea y administra restricciones de verificación

Una restricción CHECK te permite especificar que los valores de una o más columnas deben satisfacer una expresión booleana. En este artículo, describiremos cómo administrar este tipo de restricción en tu base de datos.

Agrega una restricción de verificación a una tabla nueva

En el siguiente fragmento de CREATE TABLE, creamos una tabla para almacenar información sobre los conciertos. Se incluye una restricción de verificación para garantizar que la hora de finalización de un concierto sea posterior a la hora de inicio.

CREATE TABLE Concert (
  ConcertId STRING(20),
  StartTime Timestamp,
  EndTime Timestamp,
  CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);

La definición de restricción comienza con la palabra clave CONSTRAINT. Asignamos explícitamente la restricción como start_before_end en este ejemplo, lo que facilita la identificación en mensajes de error y siempre que necesitamos hacer referencia a ella. Si no se proporciona un nombre, Cloud Spanner proporciona uno, con el nombre generado que comienza con el prefijo CK_. El nombre de las restricciones se limita al esquema, junto con los nombres de las tablas y los índices, y debe ser único dentro del esquema. La definición de la restricción de verificación consiste en la palabra clave CHECK seguida de una expresión en paréntesis. La expresión solo puede hacer referencia a columnas de esta tabla. En este ejemplo, hace referencia a StartTime y EndTime, y esta verificación garantiza que la hora de inicio de un concierto siempre sea menor que la hora de finalización.

El valor de la expresión de restricción de verificación se evalúa cuando se inserta una fila nueva o cuando se actualiza StartTime o EndTime de una fila existente. Si la expresión se evalúa como TRUE o NULL, la restricción de verificación permite el cambio de datos. Si la expresión se evalúa como FALSE, no se permite el cambio de datos.

  • Las siguientes restricciones se aplican a una restricción de verificación de término expression.

    • La expresión solo puede hacer referencia a columnas en la misma tabla.

    • La expresión debe hacer referencia a, al menos, una columna no generada, ya sea de forma directa 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 establecieron 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().

Agrega una restricción de verificación a una tabla existente

Con la siguiente declaración ALTER TABLE, agregamos una restricción para asegurarnos de que todos los ID de conciertos sean mayores que cero.

ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);

Nuevamente, le dimos un nombre a la restricción, concert_id_gt_0. Agregar una restricción CHECK a una tabla existente inicia la aplicación forzosa de la restricción de inmediato para datos nuevos y comienza una operación de larga duración a fin de validar que los datos existentes cumplen con la restricción nueva. Debido a que esta validación se realiza como una operación de larga duración, las transacciones en la tabla no se ven afectadas. Para obtener más información, consulta Rendimiento de la actualización del esquema. Si hay algún incumplimiento en los datos existentes, se revierte la restricción.

Quita una restricción de verificación

La siguiente declaración DDL descarta una restricción CHECK de la tabla Concerts.

ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;

Modifica una expresión de restricción de verificación

No se permite modificar la expresión de una restricción CHECK. En su lugar, debes descartar la restricción existente y crear una restricción nueva con la expresión nueva.

Visualiza las propiedades de una restricción de verificación

ESQUEMA DE INFORMACIÓN de Cloud Spanner contiene información sobre las restricciones de verificación de tu base de datos. Estos son algunos ejemplos de las preguntas que puedes responder si consultas el esquema de información.

¿Qué restricciones se definen en la 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 de verificación en mi base de datos?

Si agregaste una restricción de verificación a una tabla existente, es posible que desees ver su estado actual para determinar, por ejemplo, si todos los datos existentes se validaron en comparación con la restricción. Si SPANNER_STATE muestra VALIDATING_DATA en la siguiente consulta, significa que Cloud Spanner aún está en proceso de validar datos existentes con esa restricción.

SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;

¿Qué sigue?