我正在尝试通过pgadmin创建一个触发器,以便有一个计算列。
我需要这样做:c = a / b
我创建了一个函数UpdateC,它包含以下代码:
UPDATE table_name
SET c = a / b
WHERE id = @id
我将@id声明为参数。
然后我想我会创建一个触发器并将它链接到该函数,但我发现我需要将它链接到触发器函数而不是函数。
现在我正在尝试使用与上面完全相同的SQL创建触发器函数,但是我收到了下一个错误:
“UPDATE”或其附近的语法错误
在定义选项卡下我必须选择一种语言,所以我选择了“plpgsql”(其他选项是“c”和“internal”)。
任何帮助都将深表感谢!
答案 0 :(得分:6)
您应该在表格中创建BEFORE
触发器FOR EACH ROW
而不是UPDATE
,但在写入之前更改该行。
有关详细信息,请参阅the doocumentation。
以下是概念证明:
CREATE TABLE t (
id integer PRIMARY KEY,
a double precision,
b double precision,
c double precision
);
CREATE OR REPLACE FUNCTION t_trig() RETURNS trigger
LANGUAGE plpgsql AS
$$BEGIN
NEW.c = NEW.a / NEW.b;
RETURN NEW;
END;$$;
CREATE TRIGGER t_trig BEFORE INSERT OR UPDATE ON t FOR EACH ROW
EXECUTE PROCEDURE t_trig();
INSERT INTO t (id, a, b) VALUES (1, 42, 7);
INSERT 0 1
test=> SELECT * FROM t;
┌────┬────┬───┬───┐
│ id │ a │ b │ c │
├────┼────┼───┼───┤
│ 1 │ 42 │ 7 │ 6 │
└────┴────┴───┴───┘
(1 row)