Beim Erstellen einer Datenbank, die beliebige Datums-/Zeitbereiche speichert, ist es wichtig, Einschränkungen durchzusetzen, die überlappende oder benachbarte Einträge verhindern. Diese Einschränkungen sind entscheidend für die Aufrechterhaltung der Datenintegrität und -genauigkeit.
In PostgreSQL dient die EXCLUDE-Einschränkung diesem Zweck durch die Verwendung eines GiST-Index. Es bestehen jedoch häufig Bedenken hinsichtlich der Annahme einer Auflösung von einer Sekunde bei der Definition dieser Einschränkungen. Zeitstempel-Datentypen in PostgreSQL haben oft eine höhere Auflösung, was möglicherweise zu Ungenauigkeiten führt.
Lösung mit exklusiven Grenzen
Um dieses Problem zu beheben und sowohl überlappende als auch benachbarte Bereiche zu verhindern, ist es Es wird empfohlen, exklusive Grenzen ('[)') für Datums-/Zeitbereiche zu erzwingen. Dies beinhaltet das Einschließen der Untergrenze (mithilfe von „lower_inc()“) und das Ausschließen der Obergrenze („NOT Upper_inc()“) durch eine CHECK-Einschränkung. Um benachbarte Bereiche auszuschließen, kann außerdem eine weitere EXCLUDE-Einschränkung mit dem Operator „-|-“ verwendet werden.
Beispielcode:
CREATE TABLE tbl ( tbl_id serial PRIMARY KEY , tsr tsrange , CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&) , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-) , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr)) );
Diese Lösung stellt dies sicher Es sind nur Bereiche mit exklusiven Grenzen zulässig, wodurch sowohl überlappende als auch benachbarte Einträge effektiv verhindert werden. Es stellt außerdem die Datenintegrität sicher, indem es das gewünschte Bereichsverhalten erzwingt.
Das obige ist der detaillierte Inhalt vonWie kann die EXCLUDE-Einschränkung von PostgreSQL Überlappungen und benachbarte Datums-/Zeitbereiche verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!