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

Come garantire voci con intervalli di tempo non sovrapposti?

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:

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:

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.