Du var på rätt spår. Men syntaxen för uteslutningsrestriktioner är något annorlunda.
Beroende på den ej avslöjade tabelldefinitionen kan du behöva installera tillägget
(ytterligare modul) btree_gist först. En gång per db. Det behövs för mitt exempel eftersom den nödvändiga operatörsklassen inte är installerad för typen integer som standard:
CREATE EXTENSION btree_gist;
Se:
- PostgreSQL EXCLUDE USING-fel:Datatyp heltal har ingen standardoperatorklass
- Hur man använder ( installera) dblink i PostgreSQL?
Sedan:
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 &&)
); Varje kolumn måste listas med sin respektive operator.
Och du behöver en intervalltyp . Du nämner separata kolumner valid_from och valid_to . Och du nämner också tsrange och valid i det misslyckade kommandot. Det är förvirrande. Antag två timestamp kolumner, ett uttrycksindex med uttrycket tsrange(valid_from, valid_to) skulle göra det.
Relaterat:
- Utför detta driftstimmarsfråga i PostgreSQL
- Icke-överlappande, kontinuerliga tidsstämpelintervall (tstzrange) för öppettider
- Postgresql 9.4-frågan blir gradvis långsammare när man går med i TSTZRANGE med &&
- Lagra veckodag och tid?
Vanligtvis timestamptz (tstzrange ) bör väljas framför timestamp (tsrange ). Se:
Kanske , skulle en överlägsen design vara en en-till-många-relation mellan din registration tabell och 1-N-poster i ett nytt registration_range tabell. Och lite logik för att bestämma den för närvarande giltiga posten (för en given tidpunkt). Beror på mer hemlig information.