在Postgresql中为定义的周期添加周期性操作

时间:2018-11-30 22:19:51

标签: postgresql

除了独特的操作,我们还需要数据库中的重复操作。我们不希望用户能够以表格形式定义周期(所有1,2,3,..年)和周期(例如,从2018年到2020年)。该数据应用于为已定义的操作插入适当的数据集。

如果用户选择从2018年开始的年度定期性,则应在操作表中插入3个数据集(2018、2019和2020)。

如果用户选择从2018年开始的半年度周期,则仅应在动作表中插入2个数据集(2018年和2020年)。

简化的表操作如下所示:

id serial not null
id_action integer
action_year integer
periodicity integer
from_ integer
to_ integer

我需要一个sql语句的起点。

2 个答案:

答案 0 :(得分:1)

您应该使用generate_series(start, stop, step)

年度:

=> select generate_series(2018,2020,1);
 generate_series 
-----------------
            2018
            2019
            2020
(3 rows)

一年两次:

=> select generate_series(2018,2020,2);
 generate_series 
-----------------
            2018
            2020
(2 rows)

答案 1 :(得分:0)

直到现在我还不知道函数generate_series()。感谢指向我的方向。

要使事情按我的预期运行,我需要在AFTER INSERT后触发的Trigger函数中使用generate_series()。在第一次遇到recursive Trigger inserts的麻烦之后,我遇到了一个问题,我的触发器会产生许多重复的插入内容(随着选择的周期性增加)。

我的表格操作如下:

id serial not null
id_action integer
action_year integer
periodicity integer
from_ integer
to_ integer

我在桌子上的扳机:

CREATE TRIGGER tr_actions_recurrent
  AFTER INSERT
  ON actions
  FOR EACH ROW
  WHEN ((pg_trigger_depth() = 0))
  EXECUTE PROCEDURE actions_recurrent(); 

这是我的触发功能:

CREATE OR REPLACE FUNCTION actions_recurrent()
  RETURNS trigger AS
$BODY$
BEGIN
 IF NEW.periodicity >0 AND NEW.action_year <= NEW.to_-NEW.periodicity THEN
 INSERT into actions(id_action, action_year,periodicity, from_, to_)
 SELECT NEW.id_action, y, NEW.periodicity, NEW.from_, NEW.to_
 FROM actions, generate_series(NEW.from_+NEW.periodicity,NEW.to_,NEW.periodicity) AS y;
 END IF;
 RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100; 

当我插入时

INSERT INTO actions (id_action, action_year,periodicity,from_, to_)
VALUES (50,2018,4,2018,2028);

我在action_year 2018年获得一排,但2022年和2026年有13排? 以我的理解,触发函数中的IF子句应避免这种重复执行。