【发布时间】:2021-02-10 21:53:33
【问题描述】:
我是 postgres 的新手,创建了这个触发器函数来将一个更大的表汇总到另一个表中,当我在查询工具中运行它时,我正在使用 pgAdmin,什么都不会发生它不会给我错误或给我任何错误成功的消息,有什么问题?
CREATE OR REPLACE FUNCTION insert_sum_usage() RETURNS trigger AS $insert_sum_usage$
DECLARE t timestamptz;
DECLARE u double precision;
BEGIN
t=(SELECT time FROM public.temp_time where id=1 );
IF ( t > now() - interval '600 seconds')
THEN RETURN NEW;
ELSE
u=(SELECT SUM(value) FROM public.temp_usage WHERE labels[12] = 46 AND (labels[3] = 32 OR labels[3] = 62));
INSERT INTO public.temp_sum_usage VALUES (NEW.time, u);
UPDATE public.temp_time SET time=NEW.time WHERE id=1;
RETURN NEW;
END IF;
END;
$insert_sum_usage$ LANGUAGE plpgsql;
CREATE TRIGGER insert_sum_usage AFTER INSERT OR UPDATE ON public.temp_usage FOR EACH ROW EXECUTE PROCEDURE insert_sum_usage();
【问题讨论】:
-
停下来,只是不要。数据应保持无冗余以避免出现不一致的可能性。因此,将一张表上的总和写入另一张表并不是一件好事。如果您需要总和,您可以随时查询并获得 正确 结果。为方便起见,您可以创建一个存储此类查询的视图,因此不必每次都重复。
-
我认为您的触发器定义没有问题,除了上面评论中的概念性定义。 Bot 我无法遵循逻辑。请更详细地描述你的意图,并描述你的代码究竟是如何行为不端的。
-
我发现了问题,这个触发器需要很多时间来执行,并且在主表中的插入率很大并且它会产生一个巨大的队列并且它在这个过程中产生了问题,我应该使用 cron 这样做,@sticky bit 你说得对,我的方法是最糟糕的选择
标签: postgresql triggers plpgsql stored-functions