2017-10-15 11 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); 

イベントは「第3」のイベント「第二」と重複すると、次の挿入は失敗します。ただし:

insert into event (event_start, duration) 
values ('Third', timestamp '2017-10-16 12:00:00', interval '1' hour); 
+0

これを関数に組み込み、トリガを使用する方法ですか?アリーナと場所を含める。 – Lulle