Du warst auf dem richtigen Weg. Aber die Syntax für Ausschlussbeschränkungen ist etwas anders.
Abhängig von der nicht offengelegten Tabellendefinition müssen Sie möglicherweise die Erweiterung installieren
(zusätzliches Modul) btree_gist Erste. Einmal pro dB. Es wird für mein Beispiel benötigt, da die erforderliche Operatorklasse für den Typ integer nicht installiert ist standardmäßig:
CREATE EXTENSION btree_gist;
Siehe:
- PostgreSQL EXCLUDE USING error:Data type integer has no default operator class
- Verwendung von ( install) dblink in PostgreSQL?
Dann:
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 &&)
); Jede Spalte muss mit ihrem jeweiligen Operator aufgelistet werden.
Und Sie brauchen einen Bereichstyp . Sie erwähnen separate Spalten valid_from und valid_to . Und Sie erwähnen auch tsrange und valid im fehlgeschlagenen Befehl. Das ist verwirrend. Unter der Annahme von zwei timestamp Spalten, ein Ausdrucksindex mit dem Ausdruck tsrange(valid_from, valid_to) würde es tun.
Verwandte:
- Führen Sie dies aus Betriebsstundenabfrage in PostgreSQL
- Nicht überlappende, fortlaufende Zeitstempelbereiche (tstzrange) für Öffnungszeiten
- Postgresql 9.4-Abfrage wird zunehmend langsamer, wenn TSTZRANGE mit &&verbunden wird
- Speichern Sie die Wochentag und Uhrzeit?
Typischerweise timestamptz (tstzrange ) sollte statt timestamp gewählt werden (tsrange ). Siehe:
Vielleicht , wäre ein besseres Design eine Eins-zu-Viele-Beziehung zwischen Ihrer registration Tabelle und 1-N Einträge in einem neuen registration_range Tisch. Und etwas Logik, um den aktuell gültigen Eintrag (für einen bestimmten Zeitpunkt) zu ermitteln. Hängt von weiteren nicht offengelegten Informationen ab.