Postgresql分区和FK

Postgresql分区和FK

问题描述:

目前有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 
     ) 
    ; 

任何帮助理清这个?

据我所知,sessionaccountingYEAR表是sessionaccounting的子女。如果这是真的比你可以只引用父表中,而不是指相应年份表:

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

如果sessionaccountingYEAR都不是sessionaccounting的孩子,你能解释他们为什么不?