2012-03-07 61 views
2

目前有2個數據庫表sessionaccountingsessionaccountingdailysplitPostgresql分區和FK

這些表中的每一個都有數據。 Sessionaccountingdailysplit對sessionaccounting有一個FK約束。

我需要分區兩個表,以便最終結構如下:

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

原因sessionaccountingdailysplit開始在2009年是多數民衆贊成表創建

的過程時,我跟着上面做如下:

  1. 我創建的分區爲sessionaccounting根據開始時間
  2. 我創建基於日期
  3. 爲sessionaccountingdailysplit分區我創建的約束CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey FOREIGN KEY (sessionaccountingid) REFERENCES sessionaccounting2009 (id) MATCH SIMPLE

上面好像它會工作,但由於的dailysplit是如何工作的不自然。 dailysplit如何工作?它需要sessionaccounting的開始時間和結束時間,並將數據分成單獨的行。

所以如果我有一個從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表它對應於表sessionaccounting行中,以不違反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的子女。如果這是真的比你可以只引用父表中,而不是指相應年份表:

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

如果sessionaccountingYEAR都不是sessionaccounting的孩子,你能解釋他們爲什麼不?