我有一个创建触发器的任务,它应该检查数据库设计中赋值的约束。触发器应该检查新事件是否适合当前计划。两个事件不能同时发生。属性是事件的日期,时间和长度(时间)。现在我正在考虑使用新事件的时间+长度检查事件中时间+长度的间隔值。如果它们重叠,则会引发异常。我的问题是我不知道如何实现它。
答案 0 :(得分:0)
在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);