我有一张预订表。预约由日期范围和时间范围组成。它们也属于其他几种模型。我想添加一个约束,使得重复时间不可能发生预订。
我有这个:
CREATE TABLE reservations (
id integer NOT NULL,
dates daterange,
times timerange,
desk_id integer NOT NULL,
space_id integer,
);
ALTER TABLE reservations ADD EXCLUDE USING gist (dates WITH &&, times WITH &&)
效果很好。但我希望将此约束限定为desk_id和client_id。
当此记录与不同的desk_id或space_id有关时,应该可以保存重叠时间/日期的记录。
我该怎么做?
答案 0 :(得分:2)
您可以使用与您使用的完全相同的机制,还可以在排除项中添加desk_id
和space_id
。这一次,而不是使用&&
运算符(意味着重叠)与=
运算符:
ALTER TABLE reservations
ADD EXCLUDE
USING gist (desk_id WITH =, space_id WITH =, dates WITH &&, times WITH &&) ;
这些插页可以使用,因为它们涉及两个不同的desk_id
:
INSERT INTO
reservations
(id, dates, times, desk_id, space_id)
VALUES
(1, '[20170101,20170101]'::daterange, '[10:00,11:00]'::timerange, 10, 10),
(2, '[20170101,20170101]'::daterange, '[10:30,11:00]'::timerange, 20, 10) ;
此插入失败,因为您的时间范围重叠,desk_id
和space_id
:
INSERT INTO
reservations
(id, dates, times, desk_id, space_id)
VALUES
(3, '[20170101,20170101]'::daterange, '[10:00,11:00]'::timerange, 10, 10) ;