sql >> Database >  >> RDS >> PostgreSQL

Voorkomen van aangrenzende/overlappende items met EXCLUDE in PostgreSQL

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



  1. pg_dump postgres-database van externe server wanneer poort 5432 is geblokkeerd

  2. Oracle Sequence genereert geen doorlopend nummer

  3. PostgreSQL - stel een standaard celwaarde in volgens een andere celwaarde

  4. Complexe externe-sleutelbeperking in SQLAlchemy