Typy zakresów składają się z dolnej i górnej granicy, które można uwzględnić lub wykluczyć.Typowym przypadkiem użycia (i domyślnym dla typów zakresów) jest uwzględnienie niższy i wyklucz górna granica.
Z wyłączeniem nakładania się zakresy wydają się jasne. W podręczniku znajduje się ładny przykład kodu
Ponadto utwórz kolejne ograniczenie wykluczenia, korzystając z sąsiedniego operatora -|-
aby wykluczyć także sąsiadujące wpisy. Oba muszą być oparte na GiST indeksy, ponieważ GIN nie jest obecnie obsługiwany.
Aby utrzymać go w czystości, wymusiłbym [)
granice (w tym dolne i wykluczające górne) dla wszystkich wpisów z CHECK
ograniczenie za pomocą funkcji zakresu:
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<>graj tutaj
(Stare skrzypce SQL)
Niestety, tworzy to dwa identyczne indeksy GiST, aby logicznie realizować oba ograniczenia wykluczenia, tam gdzie to wystarczy. Wydaje się to być wadą obecnej implementacji (do przynajmniej Postgres 11).