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;