2015-11-01 24 views
6

In PostgreSQL, come si combina un vincolo di esclusione su una colonna di intervallo con un vincolo univoco su altre colonne scalari. O per dirla in altro modo, come faccio a garantire che il controllo della sovrapposizione di intervalli venga eseguito solo in combinazione con un controllo univoco su alcune altre colonne?Combina un vincolo di intervallo EXCLUDE PostgreSQL con un vincolo UNIQUE

Per esempio, dire che ho:

CREATE TABLE reservation (
    restaurant_id int, 
    time_range tsrange 
); 

voglio fare in modo che per ogni restaurant_id, non ci sono sovrapposizioni time_range s.

so che posso creare un vincolo di esclusiva gamma di simile:

CREATE TABLE reservation (
    restaurant_id int, 
    time_range tsrange EXCLUDE USING gist (time_range WITH &&) 
); 

ma come faccio a fare in modo che il controllo time_range è ambito da restaurant_id?

+0

Ecco una discussione proprio questo argomento: http: // thoughts.davisjeff.com/2010/09/25/exclusion-constraints-are-generalized-sql-unique/. –

risposta

7
CREATE TABLE reservation 
(
    restaurant_id int, 
    time_range tsrange, 
    EXCLUDE USING gist (restaurant_id with =, time_range WITH &&) 
); 

Si noti che è necessario installare l'estensione btree_gist perché l'indice GIST non ha un operatore di uguaglianza di default:

http://www.postgresql.org/docs/current/static/btree-gist.html