【问题标题】:Create Trigger in Postgres asking for avg()在 Postgres 中创建触发器,请求 avg()
【发布时间】:2021-08-18 19:28:54
【问题描述】:

我正在尝试创建一个触发器,在每次插入表 A 后,将表 A 中的一列的平均值添加到表 B 中。

表A(id(整数),等级(整数))
表 B(id(序列),平均值(整数))

我的触发器是:

CREATE TRIGGER rat_trig 
  AFTER INSERT ON a 
  FOR EACH ROW EXECUTE PROCEDURE upd_rat_func();

我的触发函数如下所示:

CREATE OR REPLACE FUNCTION upd_rat_func() RETURNS TRIGGER as $rating_update$
BEGIN
INSERT INTO b VALUES (DEFAULT, AVG(rating) FROM a);
RETURN NEW;
END;
$rating_update$ language plpgsql;

Postgres 告诉我,我的函数在“from”附近或某处有错误,但我找不到让它工作的方法(尚未创建触发器,因为我无法创建函数)。非常欢迎任何帮助(或者任何关于我在哪里可以找到更多关于触发器函数结构的建议,因为 postgres 文档的帮助不大)。

【问题讨论】:

    标签: sql postgresql triggers


    【解决方案1】:

    FROM 必须属于 SELECT(或 DELETE)。

    要使用子查询,请使用完整的查询并将其放在括号中:

    INSERT INTO b VALUES (DEFAULT, (SELECT AVG(rating) FROM a));
    

    但是那个触发器对我来说没有多大意义。您想要一个新行,每个INSERT 都有一个新的平均值吗? b 中的其他行呢?

    也许您正在寻找materialized view

    【讨论】:

    • 谢谢,这行得通。是的,这只是部分代码不起作用,触发器实际上有点不同。
    【解决方案2】:

    这里是 PostgreSQL 文档:

    https://www.postgresql.org/docs/12/plpgsql-trigger.html

    尝试像这样更改 INSERT 语句:

    INSERT INTO b (average) SELECT AVG(rating) FROM a;
    

    在将其添加到触发功能之前确保它工作正常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      相关资源
      最近更新 更多