Postgresql触发器不触发

时间:2016-02-17 01:01:06

标签: postgresql

我有一个功能和触发器如下:

CREATE FUNCTION update() RETURNS TRIGGER AS $logupdate$ 
DECLARE
judge boolean;
BEGIN 
judge := EXECUTE ('SELECT starttime,endtime,NEW.starttime,NEW.endtime FROM reserves WHERE bid = NEW.bid AND startdate = NEW.startdate AND (starttime,endtime) overlaps(NEW.starttime,NEW.endtime) IS NULL'); 
IF judge = f THEN RETURN false; 
END IF;
RETURN NEW; 
END;
$logupdate$ LANGUAGE plpgsql;

CREATE TRIGGER logupdate 
before UPDATE ON reserves 
FOR EACH ROW 
EXECUTE PROCEDURE update();  

触发器应检测新输入是否与之前的时间重叠,例如,如果我的表[11:00 - 13:00]中有旧时间,并且新输入是[12:00 - 14: 00]然后触发器应该向它发射并停止插入。 但是,它在我的电脑上不起作用,这里有什么问题?

1 个答案:

答案 0 :(得分:1)

您的触发器会在每一行执行。您不需要查询表。您已经可以访问旧行和新行。

CREATE FUNCTION update() RETURNS TRIGGER AS $logupdate$ 
BEGIN 
IF (NEW.starttime, NEW.endtime) OVERLAPS (OLD.starttime, OLD.endtime) THEN 
RETURN false; 
END IF;
RETURN NEW; 
END;
$logupdate$ LANGUAGE plpgsql;

然而,这是非常低效的。您应该考虑使用排除约束http://www.postgresql.org/docs/9.0/static/ddl-constraints.html

我很确定有一个排除约束可以使用OVERLAPS