Postgresql 分区和外键

3
目前有两个数据库表,分别是sessionaccountingsessionaccountingdailysplit
这两个表中都有数据。其中,sessionaccountingdailysplit表与sessionaccounting表之间存在外键(FK)约束。
我需要将这两个表进行分区,以使最终的结构如下所示:
sessionaccounting
sessionaccounting2007
sessionaccounting2008
sessionaccounting2009
sessionaccounting2010
sessionaccounting2011
sessionaccounting2012
sessionaccountingdailysplit
sessionaccountingdailysplit2009
sessionaccountingdailysplit2010
sessionaccountingdailysplit2011
sessionaccountingdailysplit2012
sessionaccountingdailysplit从2009开始的原因是该表在那一年被创建。
我执行了以下步骤来完成上述操作:
  1. 根据starttime为sessionaccounting创建分区。
  2. 根据日期为sessionaccountingdailysplit创建分区。
  3. 创建约束:CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey FOREIGN KEY (sessionaccountingid) REFERENCES sessionaccounting2009 (id) MATCH SIMPLE
以上看起来似乎会奏效,但由于dailysplit的特性,实际情况并非如此。dailysplit是如何工作的呢?它从sessionaccounting中获取starttime和endtime,并将数据拆分成单个行。例如,如果我有一个会话时间从2009-01-01 23:30:00至2009-01-03 13:00:00,则dailysplit会创建3行,每行的日期如下:2009-01-01、2009-01-02和2009-01-03。
现在,问题来了。如果会话时间为2009-12-31至2010-01-01,那么就会出现以下问题。由于sessionaccounting行位于sessionaccounting2009中,因此FK将按照sessionaccountingdailysplit2009的方式工作,并且该表中的FK指向sessionaccounting2009。但是,当Postgres尝试将新行插入到sessionaccountingdailysplit2010中时,它找不到与sessionaccounting2010匹配的FK,因为它在sessionaccounting2009中。
我需要帮助制定一条规则或触发器,即使数据的日期是2010,也要将其插入到sessionaccountingdailysplit2009中。因此,需要将数据插入到与sessionaccounting行所在表相对应的sessionaccountingdailysplit表中,以避免违反FK约束。

这是否可能?

一个视觉示例

sessionaccounting2009
1,starttime:2009-12-31,endtime:2010

我想要的

sessionaccountingdailysplit2009
1,date:2009-12-31
2,date:2010-01-01

我得到的(这违反了2010年的FK)

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个回答

1
我理解 sessionaccountingYEAR 表是 sessionaccounting 的子表。如果是这样的话,您可以直接引用父表而不是引用对应的年份表。
CONSTRAINT sessionaccountingdailysplit2009_sessionaccountingid_fkey 
FOREIGN KEY (sessionaccountingid) 
REFERENCES sessionaccounting (id) 
MATCH SIMPLE

如果sessionaccountingYEAR不是sessionaccounting的子元素,你能解释一下为什么不是吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接