Byl jsi na správné cestě. Ale syntaxe pro omezení vyloučení je trochu jiný.
V závislosti na nezveřejněné definici tabulky možná budete muset nainstalovat rozšíření
(doplňkový modul) btree_gist První. Jednou za db. Pro můj příklad je to potřeba, protože pro typ integer není nainstalována požadovaná třída operátora ve výchozím nastavení:
CREATE EXTENSION btree_gist;
Viz:
- Chyba PostgreSQL EXCLUDE USING:Datový typ celé číslo nemá žádnou výchozí třídu operátora
- Jak používat ( install) dblink v PostgreSQL?
Potom:
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 &&)
); Každý sloupec musí být uveden s příslušným operátorem.
A potřebujete typ rozsahu . Zmiňujete samostatné sloupce valid_from a valid_to . A také jste zmínil tsrange a valid v neúspěšném příkazu. To je matoucí. Za předpokladu dvou timestamp sloupce, index výrazu s výrazem tsrange(valid_from, valid_to) udělal by to.
Související:
- Proveďte toto hodiny provozu dotazu v PostgreSQL
- Nepřekrývající se nepřekrývající se rozsahy časových razítek (tstzrange) pro otevírací dobu
- Dotaz Postgresql 9.4 se postupně zpomaluje, když se připojujete k TSTZRANGE pomocí &&
- Uložte den v týdnu a čas?
Obvykle timestamptz (tstzrange ) by měla být vybrána nad timestamp (tsrange ). Viz:
Možná , lepší design by byl vztahem jedna k mnoha mezi vaší registration tabulky a 1-N záznamů v novém registration_range stůl. A nějakou logiku k určení aktuálně platného záznamu (pro jakýkoli daný časový okamžik). Závisí na více nezveřejněných informacích.