Du var på rette vej. Men syntaksen for ekskluderingsbegrænsninger er lidt anderledes.
Afhængigt af den ikke offentliggjorte tabeldefinition skal du muligvis installere udvidelsen
(ekstra modul) btree_gist
først. En gang pr. db. Det er nødvendigt for mit eksempel, da den påkrævede operatørklasse ikke er installeret for typen integer
som standard:
CREATE EXTENSION btree_gist;
Se:
- PostgreSQL EXCLUDE USING-fejl:Datatypen heltal har ingen standardoperatørklasse
- Sådan bruger du ( installere) dblink i PostgreSQL?
Så:
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 &&)
);
Hver kolonne skal være opført med dens respektive operator.
Og du har brug for en områdetype . Du nævner separate kolonner valid_from
og valid_to
. Og du nævner også tsrange
og valid
i den mislykkede kommando. Det er forvirrende. Forudsat to timestamp
kolonner, et udtryksindeks med udtrykket tsrange(valid_from, valid_to)
ville gøre det.
Relateret:
- Udfør dette timers drift forespørgsel i PostgreSQL
- Ikke-overlappende, kontinuerlige tidsstempelintervaller (tstzrange) for åbningstider
- Postgresql 9.4-forespørgsel bliver gradvist langsommere, når man tilslutter sig TSTZRANGE med &&
- Gem ugedag og tidspunkt?
Typisk timestamptz
(tstzrange
) skal vælges frem for timestamp
(tsrange
). Se:
Måske , ville et overlegent design være et en-til-mange forhold mellem din registration
tabel og 1-N poster i et nyt registration_range
bord. Og noget logik til at bestemme den aktuelt gyldige post (for et givet tidspunkt). Afhænger af mere hemmelige oplysninger.