在postgres中创建一个触发器

时间:2016-09-27 11:25:58

标签: sql database postgresql pgadmin database-trigger

我正在尝试通过pgadmin创建一个触发器,以便有一个计算列。

我需要这样做:c = a / b

我创建了一个函数UpdateC,它包含以下代码:

UPDATE table_name
SET c = a / b
WHERE id = @id

我将@id声明为参数。

然后我想我会创建一个触发器并将它链接到该函数,但我发现我需要将它链接到触发器函数而不是函数。

现在我正在尝试使用与上面完全相同的SQL创建触发器函数,但是我收到了下一个错误:

  “UPDATE”或其附近的

语法错误

在定义选项卡下我必须选择一种语言,所以我选择了“plpgsql”(其他选项是“c”和“internal”)。

任何帮助都将深表感谢!

1 个答案:

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