plpgsql:检查用户是否将唯一时间范围插入表的函数

时间:2012-12-28 23:07:05

标签: postgresql plpgsql

我在创建psql函数时遇到问题,在插入或更新表格中的行之前,该函数被称为触发器:'Performance'在特定的音乐节期间保存音乐表演。

我想要实现的是该函数将检查新性能beg_date和end_date是否不会与现有性能发生冲突。限制是在给定的音乐节中一次只能进行一次表演。

表'Performance'的结构如下:

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 个答案:

答案 0 :(得分:0)

你可以在没有使用exclusion constraintsbtree_gist的自定义psql触发器的情况下执行此操作

这是另一个问题,它完成了你想要的大部分内容。

Postgres date overlapping constraint