你好,我有下表:
id | breakname | start | finish | duration
----+-----------+-------+--------+----------
当在其他列中输入了数据时,我需要一个触发器来计算持续时间列中开始和结束的差异。
我创建了以下代码:
CREATE OR REPLACE FUNCTION break_duration_insert_update() RETURNS trigger AS $BODY$
BEGIN
if NEW.duration is null then
NEW.duration := SET duration = break(finish) - break(start);
end if;
RETURN NEW;
end
$BODY$
LANGUAGE 'plpgsql';
CREATE TRIGGER break_duration
AFTER INSERT OR UPDATE ON break FOR EACH ROW
WHEN (NEW.duration IS NULL)
EXECUTE PROCEDURE break_duration_insert_update()
但是输入数据时出现以下错误:
ERROR: column "finish" does not exist
LINE 1: SELECT finish - start
^
QUERY: SELECT finish - start
CONTEXT: PL/pgSQL function break_duration_insert_update() line 4 at assignment
我尝试在未安装触发器的情况下输入数据,并且该方法有效,所以我认为我错过了触发器编码中的某些内容。
非常感谢
戴夫
答案 0 :(得分:1)
SET duration =
作为分配:=
的一部分是完全错误的。
要访问当前行的列,您需要在每个列引用前面加上new
。所以你需要
NEW.duration := new.finish - new.start;
此外,您无法在AFTER
触发器中分配新值,因此您的触发器需要定义为之前触发器。
CREATE TRIGGER break_duration
BEFORE INSERT OR UPDATE ON break FOR EACH ROW
WHEN (NEW.duration IS NULL)
EXECUTE PROCEDURE break_duration_insert_update()
无关,但是:语言名称是一个标识符,请勿将其用单引号引起来:
LANGUAGE plpgsql;