В настоящее время есть 2 таблицы базы данных sessionaccounting
и sessionaccountingdailysplit
.
В каждой из этих таблиц есть данные.Sessionaccountingdailysplit имеет ограничение FK для sessionaccounting.
Мне нужно разделить обе таблицы так, чтобы окончательная структура выглядела следующим образом:
sessionaccounting
sessionaccounting2007
sessionaccounting2008
sessionaccounting2009
sessionaccounting2010
sessionaccounting2011
sessionaccounting2012
sessionaccountingdailysplit
sessionaccountingdailysplit2009
sessionaccountingdailysplit2010
sessionaccountingdailysplit2011
sessionaccountingdailysplit2012
Причина sessionaccountingdailysplit
начинается в 2009 году, когда таблицабыл создан
Процесс, которому я следовал для выполнения вышеизложенного, выглядит следующим образом:
- Я создал разделы для сеансового учета на основе времени начала
- Я создал разделы дляsessionaccountingdailysplit на основе даты
- Я создал ограничение
CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey FOREIGN KEY (sessionaccountingid) REFERENCES sessionaccounting2009 (id) MATCH SIMPLE
Вышеуказанное выглядит так, как будто оно будет работать, но из-за характера работы dailysplit его нет.Как работает dailysplit?Он берет время начала и время окончания сеанса и учитывает данные и разделяет их на отдельные строки.
Так что, если у меня был сеанс, который начинается с 2009-01-01 23:30:00 до 2009-01-03 13:00:00, dailysplit создает 3 строки с каждой датой в ней, поэтому 2009-01-01, 2009-01-02, 2009-01-03.
Теперь с указанным выше FK это будет работать, потому что я знаю разделенный год, в который должны войти строки.Проблема возникает, когда у меня следующий сценарий с 2009-12-31 по 2010-01-01.
Так как строка сеанса с доступом находится в sessionaccounting2009
, FK работает так, как sessionaccountingdailysplit2009
имеет FK в sessionaccounting2009
, но когда postgres пытается вставить новую строку в sessionaccountingdailysplit2010
, он не может найти FK в sessionaccounting2010
как в sessionaccounting2009
.
Мне нужна помощь в создании правила или триггера, который будет вставлять данные в sessionaccountingdailysplit2009
, даже если дата строк равна 2010. Поэтому вставьте в таблицу sessionaccountingdailysplit
где она соответствует таблице, в которой находится строка сеанса, чтобы не нарушать ограничения fk.
Возможно ли это?
Визуальный пример
sessionaccounting2009
1, starttime:2009-12-31, endtime:2010
Что я хочу
sessionaccountingdailysplit2009
1, date:2009-12-31
2, date:2010-01-01
Что я получаю (это нарушает FK в 2010 году)
sessionaccountingdailysplit2009
1, date:2009-12-31
sessionaccountingdailysplit2010
1, date:2010-01-01
Правило, которое я использую при вставке данных, но вызывает проблему
CREATE OR REPLACE RULE sessionaccountingdailysplit2009_insert AS
ON INSERT TO sessionaccountingdailysplit
WHERE new.date >= '2009-01-01 00:00:00+02'::timestamp with time zone
AND new.date < '2010-01-01 00:00:00+02'::timestamp with time zone
DO INSTEAD
INSERT INTO sessionaccountingdailysplit2009
(id, sessionaccountingid, date, inputoctets
, outputoctets, privcreditsused, usercreditsused)
VALUES (new.id, new.sessionaccountingid, new.date, new.inputoctets
,new.outputoctets, new.privcreditsused, new.usercreditsused
)
;
Любойпомочь разобраться в этом?