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.