2017-10-15 102 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