2012-03-07 1 views
2

В настоящее время есть 2 таблицы базы данных sessionaccounting и sessionaccountingdailysplit.Разделение Postgresql и FK

Каждая из этих таблиц содержит данные в них. Sessionaccountingdailysplit имеет ограничение FK для учета сеанса.

мне нужно разделить обе таблицы, так что конечная структура выглядит следующим образом:

 
sessionaccounting 
sessionaccounting2007 
sessionaccounting2008 
sessionaccounting2009 
sessionaccounting2010 
sessionaccounting2011 
sessionaccounting2012 
sessionaccountingdailysplit 
sessionaccountingdailysplit2009 
sessionaccountingdailysplit2010 
sessionaccountingdailysplit2011 
sessionaccountingdailysplit2012 

Причина sessionaccountingdailysplit начинается в 2009 году, то когда таблица была создана

Процесс я следовал сделать выше выглядит следующим образом:

  1. Я создал разделы для sessionaccounting на основе STARTTIME
  2. Я создал разделы для sessionaccountingdailysplit на основе даты
  3. Я создал ограничение 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 
     ) 
    ; 

Любая помощь в разрешении этого вопроса?

ответ

1

Я понимаю, что sessionaccountingYEAR столами являются дети sessionaccounting. Если это так, чем вы могли бы просто ссылаться на родительскую таблицу вместо обратитесь к соответствующему YEAR таблице:

CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey 
FOREIGN KEY (sessionaccountingid) 
REFERENCES sessionaccounting (id) 
MATCH SIMPLE 

Если sessionaccountingYEAR не дети sessionaccounting, могли бы вы объяснить, почему не так ли?

 Смежные вопросы

  • Нет связанных вопросов^_^