目前有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
)
;
任何幫助理清這個?