2017-10-15 52 views
0

我有一个任务在SQL中创建触发器或约束。触发器假设检查一个新事件是否适合日程安排。没有事件可以同时发生。属性是事件的日期,时间和长度。我的想法是用新条目的时间+长度检查事件中时间+长度的间隔值。如果它们重叠,则会引发异常。我真的不知道如何实现它。事件约束的SQL时间戳

+0

我们正在使用的Postgres。 – Lulle

回答

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); 
+0

它是一种包含这个函数并使用触发器的方法吗?并且包括竞技场和地方。 – Lulle