【发布时间】:2014-03-14 01:51:54
【问题描述】:
现在我写的触发器有以下问题: 如果我插入的新行与表中的一个条目冲突,它不应该插入到表中并给我错误消息。而如果新行与表不冲突,则新行应插入表中。 但是下面的代码当时间冲突时,它会给我错误,而当不冲突时,它不能将新行插入表中。 以下触发器的问题在哪里。 如何解决这个问题?
DROP FUNCTION IF EXISTS time_conflict() CASCADE;
create or replace function time_conflict()
returns trigger as
$BODY$
begin
if exists(
select *
from weeklymeeting d
where NEW.section_id=d.section_id
AND NEW.weekday= d.weekday
AND ((d.starttime <= NEW.starttime AND d.endtime > NEW.starttime) OR (d.starttime < NEW.endtime AND d.endtime >= NEW.endtime) OR (d.starttime >=NEW.starttime AND d.endtime <=NEW.endtime ))
)THEN
RAISE EXCEPTION 'SAME section time conflict!';
else
INSERT INTO weeklymeeting VALUES (NEW.*);
end if;
RETURN NEW;
end;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER time_conflict
BEFORE INSERT ON weeklymeeting for each ROW
EXECUTE PROCEDURE time_conflict();
基于 Björn Nilsson 的评论 我的问题解决了。 正确的解决方案如下:
DROP FUNCTION IF EXISTS time_conflict() CASCADE;
create or replace function time_conflict()
returns trigger as
$BODY$
begin
if exists(
select *
from weeklymeeting d
where NEW.section_id=d.section_id
AND NEW.weekday= d.weekday
AND ((d.starttime <= NEW.starttime AND d.endtime > NEW.starttime) OR (d.starttime < NEW.endtime AND d.endtime >= NEW.endtime) OR (d.starttime >=NEW.starttime AND d.endtime <=NEW.endtime ))
)THEN
RAISE EXCEPTION 'SAME section time conflict!';
end if;
RETURN NEW;
end;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER time_conflict
BEFORE INSERT ON weeklymeeting for each ROW
EXECUTE PROCEDURE time_conflict();
【问题讨论】:
-
新行是从jsp页面插入的。它与每周会议具有相同的列。
-
有冲突时间范围的说明吗?如果您真的想检查 重叠 时间范围,this related answer 可能会有所帮助。对于互斥的每周时间范围,look here.
标签: postgresql triggers