sql >> Databáze >  >> RDS >> PostgreSQL

Jak zajistit záznamy s nepřekrývajícími se časovými rozsahy?

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:

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í:

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.




  1. Escapování dvojtečky ':' v dotazech JPA

  2. Jak ukládat data JSON v MySQL

  3. MySQL/Hibernate – Jak odladím sdružené připojení MySQL, které neustále vypadává?

  4. java.lang.AbstractMethodError:com.mysql.jdbc.PreparedStatement.setBlob(ILjava/io/InputStream;)V