我在创建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'。这个功能出了什么问题?
答案 0 :(得分:0)
你可以在没有使用exclusion constraints和btree_gist的自定义psql触发器的情况下执行此操作
这是另一个问题,它完成了你想要的大部分内容。