Bereiktypen bestaan uit een onder- en een bovenrand, die kan worden opgenomen of uitgesloten. De typische use case (en standaard voor bereiktypen) is om op te nemen de onderste en uitsluiten de bovengrens.
Exclusief overlappende bereik lijkt duidelijk. Er staat een mooi codevoorbeeld in de handleiding
Maak daarnaast nog een uitsluitingsbeperking met behulp van de aangrenzende operator -|-
om ook aangrenzend . uit te sluiten inzendingen. Beide moeten gebaseerd zijn op GiST indexen als GIN wordt hiervoor momenteel niet ondersteund.
Om het schoon te houden, zou ik [)
. afdwingen grenzen (inclusief onder en exclusief boven) voor alle invoer met een CHECK
beperking met bereikfuncties:
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<>viool hier
(Oude SQL Fiddle)
Helaas creëert dit twee identieke GiST-indexen om beide uitsluitingsbeperkingen te implementeren, waar één logisch genoeg zou zijn. Dat lijkt een tekortkoming te zijn van de huidige implementatie (tot in ieder geval Postgres 11).