2012-12-28 17 views
0

我有創造的psql功能的問題,這是插入或更新表中的行之前被稱爲觸發:「性能」這specyfic音樂節期間舉行音樂表演。PLPGSQL的功能:檢查用戶是否插入唯一的時間範圍爲表

我想acomplish是該函數將檢查是否新的性能beg_date日期和結束日期將不會與現有的表演碰撞。限制是在給定的音樂節中只能有一次演出。

表 '性能' 的結構如下:

id 
beg_date : timestamp 
end_date : timestamp 
artist_id 
music_concert_id 

而且Music_Festivals:

id 
beg_date : timestamp 
end_date : timestamp 
name 

我的功能看起來像這樣:

CREATE OR REPLACE FUNCTION check_valid_performance_date() RETURNS TRIGGER AS $check_date$ 
BEGIN 
    IF EXISTS (SELECT * from wystep) THEN 
     IF EXISTS (SELECT 1 FROM wystep WHERE beg_date > NEW.beg_date AND beg_date < NEW.end_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN 
      RAISE EXCEPTION 'exception 1'; 
     ELSIF EXISTS (SELECT 1 FROM wystep WHERE beg_date < NEW.beg_date AND end_date > NEW.beg_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN 
      RAISE EXCEPTION 'exception 2 '; 
     ELSIF EXISTS (SELECT 1 FROM wystep WHERE beg_date <= NEW.beg_date AND NEW.end_date <= end_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN 
      RAISE EXCEPTION 'exception 3 '; 
     END IF; 
    END IF; 

    RETURN NEW; 
END 
$check_date$ LANGUAGE plpgsql; 

我的觸發器:

CREATE TRIGGER check_valid_performance 
AFTER INSERT OR UPDATE OR DELETE ON Performance 
FOR EACH ROW EXECUTE PROCEDURE check_valid_performance_date(); 

但我得到'異常3',即使我從空表開始。這個功能有什麼問題?

+1

看在9.2新範圍類型作爲由Falmarri提到與排除的約束相結合。 http://www.depesz.com/2011/11/07/waiting-for-9-2-range-data-types/ –

回答

0

你也許可以做到這一點,而無需使用exclusion constraintsbtree_gist

定製psql的觸發下面是做你最想要的東西,我認爲另一個問題。

Postgres date overlapping constraint

+0

這就是我一直在尋找的。不過,我也可以使用SQL OVERLAPS算子,「當兩個時間段(由它們的端點定義)重疊時會生成真,當它們不重疊時爲假」 –

相關問題