在 postgres 中创建触发器
Creating a trigger in postgres
我正在尝试通过 pgadmin 创建一个触发器以获得计算列。
我需要做:c = a / b
我创建了一个函数 UpdateC,其中包含以下代码:
UPDATE table_name
SET c = a / b
WHERE id = @id
并且我将@id 声明为参数。
然后我想我会创建一个触发器并将它 link 到那个函数,但我发现我需要 link 它到一个触发器函数而不是一个函数。
现在我正在尝试创建一个与上面 SQL 完全相同的触发器函数,但我遇到了下一个错误:
syntax error at or near "UPDATE"
在定义选项卡下我必须选择一种语言,所以我选择了"plpgsql"(其他选项是"c"和"internal")。
任何帮助将不胜感激!
您应该创建 BEFORE
触发器 FOR EACH ROW
而不是 UPDATE
table,但在写入之前更改行。
这是一个概念证明:
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)
我正在尝试通过 pgadmin 创建一个触发器以获得计算列。
我需要做:c = a / b
我创建了一个函数 UpdateC,其中包含以下代码:
UPDATE table_name
SET c = a / b
WHERE id = @id
并且我将@id 声明为参数。
然后我想我会创建一个触发器并将它 link 到那个函数,但我发现我需要 link 它到一个触发器函数而不是一个函数。
现在我正在尝试创建一个与上面 SQL 完全相同的触发器函数,但我遇到了下一个错误:
syntax error at or near "UPDATE"
在定义选项卡下我必须选择一种语言,所以我选择了"plpgsql"(其他选项是"c"和"internal")。
任何帮助将不胜感激!
您应该创建 BEFORE
触发器 FOR EACH ROW
而不是 UPDATE
table,但在写入之前更改行。
这是一个概念证明:
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)