PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zapobieganie sąsiednim/nakładającym się wpisom za pomocą EXCLUDE w PostgreSQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skompresowane dzienniki archiwum PostgreSQL w systemie Windows

  2. Jak uzyskać aktualny czas w PostgreSQL

  3. Jak skonfigurować AppArmor dla PostgreSQL i TimescaleDB?

  4. Wyłącz sprawdzanie kluczy obcych PostgreSQL dla migracji

  5. Jak stworzyć indeks dla elementów tablicy w PostgreSQL?