sql >> Databáze >  >> RDS >> PostgreSQL

Prevence sousedících/překrývajících se položek pomocí EXCLUDE v PostgreSQL

Typy rozsahů se skládají z dolního a horního ohraničení, které lze zahrnout nebo vyloučit. Typický případ použití (a výchozí pro typy rozsahů) je zahrnout nižší a vyloučit horní mez.

S výjimkou překrývajících se rozsahy se zdají být jasné. V manuálu je pěkný příklad kódu

Kromě toho vytvořte další omezení vyloučení využívající sousední operátor -|- také vyloučit sousední záznamy. Oba musí být založeny na GiST indexuje, protože GIN pro to v současné době není podporován.

Aby to zůstalo čisté, prosadil bych [) hranice (včetně spodních a vyjma horních) pro všechny položky s CHECK omezení pomocí funkcí rozsahu:

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<>zde hrajte
(Staré housle SQL)

Bohužel se tím vytvoří dva identické GiST indexy pro implementaci obou omezení vyloučení, kde by logicky stačilo jedno. To se zdá být nedostatkem současné implementace (až do minimálně Postgres 11).



  1. Jak odstranit duplikáty v tabulce MySQL?

  2. GeneratedValue v Postgresu

  3. Existuje typ časového razítka automatické úpravy pro sloupce Oracle?

  4. PostgreSQL vs MySQL, srovnání