事件约束的

时间:2017-10-15 11:18:57

标签: sql postgresql triggers timestamp constraints

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

1 个答案:

答案 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);