Eri sulla strada giusta. Ma la sintassi per i vincoli di esclusione è leggermente diverso.
A seconda della definizione della tabella non divulgata, potrebbe essere necessario installare l'estensione
(modulo aggiuntivo) btree_gist
primo. Una volta per db. È necessario per il mio esempio poiché la classe operator richiesta non è installata per il tipo integer
per impostazione predefinita:
CREATE EXTENSION btree_gist;
Vedi:
- Errore EXCLUDE USING di PostgreSQL:il tipo di dati integer non ha una classe operatore predefinita
- Come usare ( install) dblink in PostgreSQL?
Quindi:
CREATE TABLE registration (
tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a integer NOT NULL
, col_b integer NOT NULL
, valid_from timestamp
, valid_to timestamp
, CONSTRAINT no_overlap
EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);
Ogni colonna deve essere elencata con il rispettivo operatore.
E hai bisogno di un tipo di intervallo . Menzioni colonne separate valid_from
e valid_to
. E menzioni anche tsrange
e valid
nel comando fallito. Questo è confuso. Supponendo due timestamp
colonne, un indice di espressione con l'espressione tsrange(valid_from, valid_to)
lo farebbe.
Correlati:
- Esegui questo query ore di funzionamento in PostgreSQL
- Intervalli di timestamp continui e non sovrapposti (tstzrange) per gli orari di apertura
- La query Postgresql 9.4 diventa progressivamente più lenta quando si accede a TSTZRANGE con &&
- Conserva il giorno della settimana e ora?
In genere, timestamptz
(tstzrange
) deve essere scelto su timestamp
(tsrange
). Vedi:
Forse , un design superiore sarebbe una relazione uno-a-molti tra la tua registration
tabella e 1-N voci in un nuovo registration_range
tavolo. E un po' di logica per determinare la voce attualmente valida (per un dato momento). Dipende da informazioni più riservate.