触发从同一表的另一列中减去一列

时间:2018-06-29 11:46:47

标签: postgresql plpgsql database-trigger

你好,我有下表:

 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

我尝试在未安装触发器的情况下输入数据,并且该方法有效,所以我认为我错过了触发器编码中的某些内容。

非常感谢

戴夫

1 个答案:

答案 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;