触发从同一列中减去另一列 table
trigger to subtract a column from another in the same table
你好,我有下面的 table :
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
我试过在没有安装触发器的情况下输入数据并且成功了所以我想我在触发器编码中遗漏了一些东西。
非常感谢
戴夫
SET duration =
作为赋值的一部分 :=
是完全错误的。
要访问当前行的列,您需要在每个列引用前加上前缀 new
。所以你需要
NEW.duration := new.finish - new.start;
此外,您不能在 AFTER
触发器中分配新值,因此您的触发器需要定义为 BEFORE 触发器。
CREATE TRIGGER break_duration
<b>BEFORE</b> INSERT OR UPDATE ON break FOR EACH ROW
WHEN (NEW.duration IS NULL)
EXECUTE PROCEDURE break_duration_insert_update()
无关,但是:语言名是标识符,不要放在单引号里:
LANGUAGE plpgsql;
你好,我有下面的 table :
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
我试过在没有安装触发器的情况下输入数据并且成功了所以我想我在触发器编码中遗漏了一些东西。
非常感谢
戴夫
SET duration =
作为赋值的一部分 :=
是完全错误的。
要访问当前行的列,您需要在每个列引用前加上前缀 new
。所以你需要
NEW.duration := new.finish - new.start;
此外,您不能在 AFTER
触发器中分配新值,因此您的触发器需要定义为 BEFORE 触发器。
CREATE TRIGGER break_duration
<b>BEFORE</b> INSERT OR UPDATE ON break FOR EACH ROW
WHEN (NEW.duration IS NULL)
EXECUTE PROCEDURE break_duration_insert_update()
无关,但是:语言名是标识符,不要放在单引号里:
LANGUAGE plpgsql;