在 Postgres 中,您可以使用 exclusion constraint 轻松完成此操作,无需触发器。
假设您的表格如下所示:
create table event
(
id serial primary key,
event_name varchar(100),
event_start timestamp,
duration interval
);
然后您可以使用以下约束来防止重叠事件:
alter table event
add constraint no_overlapping_events
exclude using gist (tsrange(event_start, event_start + duration) with &&);
约束定义中的tsrange() 创建一个timestamp range,可以有效地比较重叠行。
以下两次插入都会成功:
insert into event (event_name, event_start, duration)
values ('First', timestamp '2017-10-16 10:00:00', interval '2' hour);
insert into event (event_start, duration)
values ('Second', timestamp '2017-10-16 12:00:00', interval '4' hour);
但是,由于事件“第三”与事件“第二”重叠,以下插入将失败:
insert into event (event_start, duration)
values ('Third', timestamp '2017-10-16 12:00:00', interval '1' hour);