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).