Områdetyper består af en nedre og en øvre kant, som kan inkluderes eller udelukkes. Den typiske anvendelse (og standard for områdetyper) er at inkludere den nederste og ekskluder den øvre grænse.
Ekskluderer overlappende intervaller synes klare. Der er et fint kodeeksempel i manualen
Derudover skal du oprette en anden ekskluderingsbegrænsning ved at bruge den tilstødende operator -|-
for også at udelukke tilstødende indgange. Begge skal være baseret på GiST indekser som GIN er i øjeblikket ikke understøttet til dette.
For at holde det rent, ville jeg gennemtvinge [)
grænser (inklusive nedre og eksklusive øvre) for alle poster med en CHECK
begrænsning ved hjælp af rækkeviddefunktioner:
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<>spil her
(Gammel SQL-violin)
Desværre skaber dette to identiske GiST-indekser til at implementere begge udelukkelsesbegrænsninger, hvor den ene ville være tilstrækkelig, logisk. Det ser ud til at være en mangel ved den nuværende implementering (op til mindst Postgres 11).