除了独特的操作,我们还需要数据库中的重复操作。我们不希望用户能够以表格形式定义周期(所有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语句的起点。
答案 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子句应避免这种重复执行。