Postgresql分区和FK
目前有2个数据库表sessionaccounting
和sessionaccountingdailysplit
。Postgresql分区和FK
这些表中的每一个都有数据。 Sessionaccountingdailysplit对sessionaccounting有一个FK约束。
我需要分区两个表,以便最终结构如下:
sessionaccounting sessionaccounting2007 sessionaccounting2008 sessionaccounting2009 sessionaccounting2010 sessionaccounting2011 sessionaccounting2012 sessionaccountingdailysplit sessionaccountingdailysplit2009 sessionaccountingdailysplit2010 sessionaccountingdailysplit2011 sessionaccountingdailysplit2012
原因sessionaccountingdailysplit
开始在2009年是多数民众赞成表创建
的过程时,我跟着上面做如下:
- 我创建的分区为sessionaccounting根据开始时间
- 我创建基于日期
- 为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
的孩子,你能解释他们为什么不?