PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann man Einträge mit nicht überlappenden Zeitbereichen sicherstellen?

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:

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:

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.