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:
- Error de USO DE EXCLUSIÓN de PostgreSQL:el tipo de datos entero no tiene una clase de operador predeterminada
- Cómo usar ( instalar) dblink en PostgreSQL?
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:
- Realice esto consulta de horas de funcionamiento en PostgreSQL
- Intervalos de marcas de tiempo continuas y sin superposición (tstzrange) para los horarios de apertura
- La consulta de Postgresql 9.4 se vuelve progresivamente más lenta cuando se une a TSTZRANGE con &&
- Almacenar el día de la semana y hora?
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.