sql >> Database teknologi >  >> RDS >> PostgreSQL

Forhindrer tilstødende/overlappende poster med EXCLUDE i PostgreSQL

Områdetyper består af en nedre og en øvre kant, som kan inkluderes eller udelukkes. Den typiske anvendelse (og standard for områdetyper) er at inkludere den nederste og ekskluder den øvre grænse.

Ekskluderer overlappende intervaller synes klare. Der er et fint kodeeksempel i manualen

Derudover skal du oprette en anden ekskluderingsbegrænsning ved at bruge den tilstødende operator -|- for også at udelukke tilstødende indgange. Begge skal være baseret på GiST indekser som GIN er i øjeblikket ikke understøttet til dette.

For at holde det rent, ville jeg gennemtvinge [) grænser (inklusive nedre og eksklusive øvre) for alle poster med en CHECK begrænsning ved hjælp af rækkeviddefunktioner:

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<>spil her
(Gammel SQL-violin)

Desværre skaber dette to identiske GiST-indekser til at implementere begge udelukkelsesbegrænsninger, hvor den ene ville være tilstrækkelig, logisk. Det ser ud til at være en mangel ved den nuværende implementering (op til mindst Postgres 11).



  1. Hvor stor kan en MySQL-database blive, før ydeevnen begynder at forringes

  2. Hvad kræver dette JavaScript?

  3. Søg efter "hele ord match" med SQL Server LIKE-mønster

  4. Skjult ydeevne og håndteringsforbedringer i SQL Server 2012/2014