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

Prevención de entradas adyacentes/superpuestas con EXCLUDE en PostgreSQL

Los tipos de rango constan de un borde superior e inferior, que se pueden incluir o excluir. El caso de uso típico (y predeterminado para los tipos de rango) es incluir el inferior y excluir el límite superior.

Excluyendo superposición rangos parece claro. Hay un buen ejemplo de código en el manual

Además, cree otra restricción de exclusión empleando el operador adyacente -|- para excluir también adyacente entradas. Ambos deben estar basados ​​en GiST índices como GIN actualmente no es compatible con esto.

Para mantenerlo limpio, aplicaría [) límites (incluido el inferior y excluyendo el superior) para todas las entradas con un CHECK restricción usando funciones de rango:

CREATE TABLE tbl (
   tbl_id serial PRIMARY KEY
 , tsr tsrange
 , CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&)
 , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-)
 , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);

db<>violín aquí
(Antiguo violín SQL)

Desafortunadamente, esto crea dos índices GiST idénticos para implementar ambas restricciones de exclusión, donde uno sería suficiente, lógicamente. Eso parece ser una deficiencia de la implementación actual (hasta al menos Postgres 11).