Типовете диапазон се състоят от долна и горна граница, които могат да бъдат включени или изключени. Типичният случай на използване (и по подразбиране за типовете диапазон) е включване по-ниската и изключете горната граница.
С изключение на припокриване диапазоните изглеждат ясни. В ръководството има хубав пример за код
Освен това създайте друго ограничение за изключване, използвайки съседния оператор -|-
за да изключите и съседни записи. И двете трябва да се основават на GiST индекси, тъй като GIN в момента не се поддържа за това.
За да го поддържам чист, бих наложил [)
граници (включително долните и с изключение на горните) за всички записи с CHECK
ограничение с помощта на функции за диапазон:
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))
);
db<>цигулка тук
(Стара SQL цигулка)
За съжаление, това създава две идентични GiST индекси за прилагане на двете ограничения за изключване, където едно би било достатъчно, логично. Това изглежда е недостатък на текущата реализация (до поне Postgres 11).