sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo garantizar entradas con rangos de tiempo que no se superpongan?

Estabas en el camino correcto. Pero la sintaxis para restricciones de exclusión es ligeramente diferente.

Según la definición de la tabla no revelada, es posible que deba instalar la extensión (módulo adicional) btree_gist primero. Una vez por db. Es necesario para mi ejemplo ya que la clase de operador requerida no está instalada para el tipo integer por defecto:

CREATE EXTENSION btree_gist;

Ver:

Entonces:

CREATE TABLE registration  (
  tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a  integer NOT NULL
, col_b  integer NOT NULL
, valid_from timestamp
, valid_to   timestamp
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);

Cada columna debe enumerarse con su operador respectivo.

Y necesitas un tipo de rango . Mencionas columnas separadas valid_from y valid_to . Y también mencionas tsrange y valid en el comando fallido. Eso es confuso. Asumiendo dos timestamp columnas, un índice de expresión con la expresión tsrange(valid_from, valid_to) lo haría.

Relacionado:

Normalmente, timestamptz (tstzrange ) debe elegirse sobre timestamp (tsrange ). Ver:

Tal vez , un diseño superior sería una relación de uno a muchos entre su registration tabla y entradas 1-N en un nuevo registration_range mesa. Y algo de lógica para determinar la entrada actualmente válida (para cualquier momento dado). Depende de más información no revelada.