如何在PostgreSQL中添加带有where子句的约束?

时间:2017-01-30 00:08:09

标签: postgresql

我有一张预订表。预约由日期范围和时间范围组成。它们也属于其他几种模型。我想添加一个约束,使得重复时间不可能发生预订。

我有这个:

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有关时,应该可以保存重叠时间/日期的记录。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以使用与您使用的完全相同的机制,还可以在排除项中添加desk_idspace_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_idspace_id

INSERT INTO 
    reservations 
    (id, dates, times, desk_id, space_id)
VALUES 
    (3, '[20170101,20170101]'::daterange, '[10:00,11:00]'::timerange, 10, 10) ;