Бяхте на прав път. Но синтаксис за ограничения за изключване е малко по-различен.
В зависимост от неразкритата дефиниция на таблицата може да се наложи да инсталирате разширението
(допълнителен модул) btree_gist
първи. Веднъж на db. Това е необходимо за моя пример, тъй като необходимият операторен клас не е инсталиран за тип integer
по подразбиране:
CREATE EXTENSION btree_gist;
Вижте:
- Грешка при ИЗКЛЮЧВАНЕ НА ИЗПОЛЗВАНЕТО на PostgreSQL:Цяло число на типа данни няма операторен клас по подразбиране
- Как да използвате ( инсталирате) dblink в PostgreSQL?
След това:
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 &&)
);
Всяка колона трябва да бъде посочена със съответния й оператор.
И имате нужда от тип диапазон . Споменавате отделни колони valid_from
и valid_to
. И също така споменавате tsrange
и valid
в неуспешната команда. Това е объркващо. Приемайки две timestamp
колони, индекс на израз с израза tsrange(valid_from, valid_to)
би го направил.
Свързани:
- Изпълнете това заявка за часове работа в PostgreSQL
- Непрепокриващи се, непрекъснати диапазони на клеймото за време (tstzrange) за работно време
- Заявката за Postgresql 9.4 става прогресивно по-бавна при присъединяване към TSTZRANGE с &&
- Съхранявайте ден от седмицата и час?
Обикновено, timestamptz
(tstzrange
) трябва да се избере вместо timestamp
(tsrange
). Вижте:
Може би , превъзходен дизайн би бил връзката "един към много" между вашата registration
таблица и 1-N записи в нов registration_range
маса. И някаква логика за определяне на текущо валидния запис (за всеки даден момент от време). Зависи от още неразкрита информация.