我有一个功能和触发器如下:
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]然后触发器应该向它发射并停止插入。 但是,它在我的电脑上不起作用,这里有什么问题?
答案 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