Postgresql 触发器从同一表中的另一列中减去一列
你好,我有下表:Postgresql 触发器从同一表中的另一列中减去一列,postgresql,plpgsql,database-trigger,Postgresql,Plpgsql,Database Trigger,你好,我有下表: id | breakname | start | finish | duration ----+-----------+-------+--------+---------- 我需要的是一个触发器,当在其他列中输入数据时,计算duration列中开始和结束的差异 我创建了以下代码: CREATE OR REPLACE FUNCTION break_duration_insert_update() RETURNS trigger AS $BODY$ BEGIN if
id | breakname | start | finish | duration
----+-----------+-------+--------+----------
我需要的是一个触发器,当在其他列中输入数据时,计算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
我试着在没有安装触发器的情况下输入数据,这很有效,所以我认为我在触发器编码中遗漏了一些东西
非常感谢
Dave
将持续时间设置为作业的一部分:=
是完全错误的
要访问当前行的列,需要在每个列引用前面加上new
。所以你需要
NEW.duration := new.finish - new.start;
此外,您不能在触发器之后的中指定新值,因此您的触发器需要定义为之前的触发器
CREATE TRIGGER break_duration
BEFORE INSERT OR UPDATE ON break FOR EACH ROW
WHEN (NEW.duration IS NULL)
EXECUTE PROCEDURE break_duration_insert_update()
我已添加更改,但现在出现以下错误:错误:函数break(不带时区的时间)不存在第1行:选择break(new.finish)-break(new.start)^提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。查询:选择break(new.finish)-break(new.start)上下文:PL/pgSQL函数break\u duration\u insert\u update()第4行在赋值显然,就我理解你的问题而言,你不需要那种break()。
LANGUAGE plpgsql;