PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Evitando entradas adjacentes/sobrepostas com EXCLUDE no PostgreSQL


Os tipos de intervalo consistem em uma borda inferior e superior, que podem ser incluídas ou excluídas. O caso de uso típico (e padrão para tipos de intervalo) é incluir o menor e excluir o limite superior.

Excluindo sobreposição intervalos parece claro. Há um bom exemplo de código no manual

Além disso, crie outra restrição de exclusão empregando o operador adjacente -|- para também excluir adjacentes entradas. Ambos devem ser baseados em GiST índices como GIN atualmente não é suportado para isso.

Para mantê-lo limpo, eu aplicaria [) limites (incluindo inferior e excluindo superior) para todas as entradas com um CHECK restrição usando funções de intervalo:
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<>mexa aqui
(antigo violino SQL)

Infelizmente, isso cria dois índices GiST idênticos para implementar ambas as restrições de exclusão, onde uma seria suficiente, logicamente. Isso parece ser uma falha da implementação atual (até pelo menos o Postgres 11).