Добавить повторяющиеся действия за определенный период в Postgresql - PullRequest
0 голосов
/ 01 декабря 2018

Помимо уникальных действий нам нужны повторяющиеся действия в нашей базе данных.Мы не хотим, чтобы пользователь мог определять периодичность (все 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 голосов
/ 02 декабря 2018

Я до сих пор не знал функцию generate_series ().Спасибо, что указал мне в этом направлении.

Чтобы все работало так, как я задумал, мне нужно использовать generate_series () внутри функции Trigger, которая запускается ПОСЛЕ INSERT.После первых проблем с рекурсивными вставками триггера У меня теперь проблема в том, что мой триггер выдает много дублирующих вставок (увеличивается с выбранной периодичностью).

Мои действия с таблицей выглядят так:

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, но 13 строк 2022 и 2026 ??В моем понимании, предложение IF в триггер-функции должно избегать такого повторного выполнения.

0 голосов
/ 01 декабря 2018

Вы должны использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...