【问题标题】:postgresql trigger for insert用于插入的 postgresql 触发器
【发布时间】: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


【解决方案1】:

不需要触发器:

ALTER TABLE weeklymeeting ADD CONSTRAINT section_weekday_unique_constraint UNIQUE (section, weekday);

这会在这两列上创建一个索引,因此您可能希望颠倒它们的顺序,具体取决于您查询数据的方式

【讨论】:

  • 教授需要用到触发器
  • 好的,好吧,你应该返回NEW,否则它不会工作,因为它是一个前触发器。那么你就不需要手动插入了。
  • 你看到我对评论的编辑了吗?不要手动插入,只需返回 NEW
  • 我认为手动插入会导致触发器再次被触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多