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.