В настоящее время есть 2 таблицы базы данных sessionaccounting
и sessionaccountingdailysplit
.Разделение Postgresql и FK
Каждая из этих таблиц содержит данные в них. Sessionaccountingdailysplit имеет ограничение FK для учета сеанса.
мне нужно разделить обе таблицы, так что конечная структура выглядит следующим образом:
sessionaccounting sessionaccounting2007 sessionaccounting2008 sessionaccounting2009 sessionaccounting2010 sessionaccounting2011 sessionaccounting2012 sessionaccountingdailysplit sessionaccountingdailysplit2009 sessionaccountingdailysplit2010 sessionaccountingdailysplit2011 sessionaccountingdailysplit2012
Причина sessionaccountingdailysplit
начинается в 2009 году, то когда таблица была создана
Процесс я следовал сделать выше выглядит следующим образом:
- Я создал разделы для sessionaccounting на основе STARTTIME
- Я создал разделы для 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.
Поскольку sessionaccounting строка в 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
)
;
Любая помощь в разрешении этого вопроса?