sql >> Databasteknik >  >> RDS >> PostgreSQL

Förhindra intilliggande/överlappande poster med EXCLUDE i PostgreSQL

Områdestyper består av en nedre och en övre kant, som kan inkluderas eller exkluderas. Det typiska användningsfallet (och standard för intervalltyper) är att inkludera den lägre och uteslut den övre gränsen.

Exkluderar överlappande intervallen verkar tydliga. Det finns ett bra kodexempel i manualen

Skapa dessutom en annan uteslutningsrestriktion genom att använda den intilliggande operatorn -|- för att även utesluta intilliggande poster. Båda måste baseras på GiST index som GIN stöds för närvarande inte för detta.

För att hålla det rent skulle jag tvinga fram [) gränser (inklusive nedre och exklusive övre) för alla poster med en CHECK begränsning som använder intervallfunktioner:

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<>spela här
(Gammal SQL-fiol)

Tyvärr skapar detta två identiska GiST-index för att implementera båda uteslutningsbegränsningarna, där en logiskt sett skulle räcka. Det verkar vara en brist i den nuvarande implementeringen (upp till åtminstone Postgres 11).



  1. Databastrender 2019 – SQL vs. NoSQL, bästa databaser, enstaka vs. flera databasanvändning

  2. När ska jag använda en tabellvariabel kontra temporär tabell i sql-servern?

  3. INSERT-sats i Oracle

  4. Hur LOWER()-funktionen fungerar i MySQL