Wie können Einträge mit sich nicht überschneidenden Zeitspannen sichergestellt werden?

stimmen
1

Ich muss sicherstellen, dass meine Datenbank nur Einträge enthält, bei denen zwei oder mehr ihrer Spalten eindeutig sind. Dies kann leicht mit einer UNIQUEEinschränkung über diese Spalten erreicht werden.

In meinem Fall muss ich die Vervielfältigung nur für sich überschneidende Zeitbereiche verbieten. Die Tabelle hat valid_fromund valid_toSpalten. In einigen Fällen kann es notwendig sein, zuerst den aktiven Eintrag auf abzulaufen, indem man , einstellt valid_to = nowund dann einen neuen Eintrag einfügt, der an valid_from = nowund valid_to = infinityangepasst ist.

Ich scheine in der Lage zu sein, den vorherigen Eintrag ohne Probleme mit UPDATE, ablaufen zu lassen, aber das Einfügen des neuen Eintrags scheint problematisch zu sein, da meine Basisspalten derzeit UNIQUE, sind und daher nicht erneut hinzugefügt werden können

Ich dachte an das Hinzufügen valid_fromund valid_toals Teil der UNIQUEBeschränkung, aber das würde die Beschränkung nur lockerer machen und duplikate und sich überschneidende Zeitbereiche existieren.

Veröffentlicht am 10/05/2020 um 19:31
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Sie waren auf dem richtigen Weg. Aber die Syntax für Ausschlussbeschränkungen ist etwas anders:

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 timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Möglicherweise müssen Sie das Zusatzmodul btree_gistzuerst installieren, je nach Ihrer nicht offengelegten Tabellendefinition.

Jede Spalte muss mit ihrem jeweiligen Operator aufgelistet werden.

Und Sie benötigen einen Bereichstyp. Angenommen timestamp with time zonefür valid_fromund valid_to, würde der Ausdruck tstzrange(valid_from, valid_to)genügen.

Verwandt:


Vielleicht wäre ein besseres Design eine Eins-zu-viele-Beziehung zwischen Ihrer registrationTabelle und 1-N Einträgen in einer neuen registration_rangeTabelle. Und etwas Logik, um den aktuell gültigen Eintrag (für jeden beliebigen Zeitpunkt) zu bestimmen. Hängt von mehr nicht offengelegten Informationen ab.


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more