PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verhindern benachbarter/überlappender Einträge mit EXCLUDE in PostgreSQL

Bereichstypen bestehen aus einer unteren und einer oberen Grenze, die ein- oder ausgeschlossen werden können. Der typische Anwendungsfall (und Standard für Bereichstypen) ist das Einschließen das untere und ausschließen die Obergrenze.

Ausgenommen Überschneidungen Bereiche scheint klar. Es gibt ein nettes Codebeispiel im Handbuch

Erstellen Sie außerdem eine weitere Ausschlussbeschränkung, indem Sie den angrenzenden Operator -|- verwenden um auch angrenzend auszuschließen Einträge. Beide müssen auf GiST basieren Indizes, da GIN hierfür derzeit nicht unterstützt wird.

Um es sauber zu halten, würde ich [) erzwingen Grenzen (einschließlich unterer und ausschließlich oberer) für alle Einträge mit einem CHECK Einschränkung mit Bereichsfunktionen:

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<>hier fummeln
(Alte SQL-Geige)

Leider entstehen dadurch zwei identische GiST-Indizes, um beide Ausschlussbeschränkungen zu implementieren, wo logischerweise eine ausreichen würde. Das scheint ein Manko der aktuellen Implementierung zu sein (mindestens bis Postgres 11).