Heim > Datenbank > MySQL-Tutorial > Wie kann die EXCLUDE-Einschränkung von PostgreSQL überlappende und benachbarte Datums-/Zeitbereichseinträge verhindern?

Wie kann die EXCLUDE-Einschränkung von PostgreSQL überlappende und benachbarte Datums-/Zeitbereichseinträge verhindern?

Barbara Streisand
Freigeben: 2025-01-04 00:30:38
Original
956 Leute haben es durchsucht

How Can PostgreSQL's EXCLUDE Constraint Prevent Overlapping and Adjacent Date/Time Range Entries?

Verhindern benachbarter/überlappender Einträge mit EXCLUDE in PostgreSQL

Problem:

Beim Erstellen eines Wenn Sie eine Datenbank zum Speichern beliebiger Datums-/Zeitbereiche verwenden, besteht das Ziel darin, überlappende und benachbarte Einträge zu verhindern. Es wird eine Einschränkung mithilfe einer EXCLUDE-Klausel und eines GiST-Index verwendet, es bestehen jedoch Bedenken hinsichtlich der Annahme einer zweiten Lösung.

Lösung 1: Annahme einer zweiten Lösung

Wenn die Anwendung erfordert nur eine zweite Auflösung, vorausgesetzt, dass dies in der Einschränkung ausreichend sein könnte. Allerdings erfordern Datentypen mit höherer Auflösung möglicherweise eine robustere Lösung.

Lösung 2: Inklusive Grenzen

Inklusive Grenzen ([]) für den unteren und oberen Bereich ermöglichen Überlappungserkennung durch eine CHECK-Einschränkung unter Verwendung von Bereichsfunktionen. Eine EXCLUDE-Einschränkung mit && stellt sicher, dass es keine Überlappung gibt, während eine andere CHECK-Einschränkung inklusive Grenzen erzwingt.

Lösung 3: Kanonische Grenzen

Kanonische Grenzen ([)] ermöglichen nicht- Überlappung durch eine EXCLUDE-Einschränkung mit &&. Darüber hinaus wird ein benachbarter Operator (-|-) in einer separaten EXCLUDE-Einschränkung verwendet, um benachbarte Einträge zu verhindern. Eine CHECK-Einschränkung stellt geeignete Grenzwerte sicher.

Implementierungsdetails:

-- Solution 2: Inclusive Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_enforce_incl_bounds CHECK (lower_inc(tsr) AND upper_inc(tsr))
);

-- Solution 3: Canonical Bounds
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))
);
Nach dem Login kopieren

Empfehlung:

Lösung 3 bietet a Robuste Lösung für die Handhabung sowohl überlappender als auch benachbarter Einträge, unabhängig von der Auflösungsanforderung.

Das obige ist der detaillierte Inhalt vonWie kann die EXCLUDE-Einschränkung von PostgreSQL überlappende und benachbarte Datums-/Zeitbereichseinträge verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage