2012-02-17 87 views
2

理想情況下,9.1中新的「WITH ROWS」功能將支持跨數據庫邊界,但它似乎只能在單個數據庫中工作。將古老的數據從一個數據庫表存檔到Postgresql 9.1中的另一個數據庫表中?

WITH moved_rows AS (
    DELETE FROM events 
    WHERE 
     "date" >= '2010-01-01' AND 
     "date" < '2011-01-01' 
    RETURNING * 
) 
INSERT INTO events_archive 
SELECT * FROM moved_rows; 

我希望我能夠指定事件像「DELETE FROM LiveDB.events」,然後我可以做「INSERT INTO ArchiveDB.events」。 dblink似乎無法獲得要移動的行的列表,並且即使它確實如此,我也不確定這條語句是否跨DB的事務安全性...

+0

模式在這種情況下可能很有用。他們能滿足你的需求嗎? – 2012-02-18 08:24:07

回答

5

您可以將數據轉儲到文件(使用SQL COPYpsql \copy),並在一個事務中將其刪除,然後將其導入到另一個事務中的另一個數據庫中。要在單個事務中執行這兩個步驟,您需要XA(分佈式事務)。從LiveDB

BEGIN TRANSACTION; 
COPY (
    SELECT * FROM events 
    WHERE "date" >= '2010-01-01' 
    AND "date" < '2011-01-01' 
) TO '/tmp/events.csv' WITH CSV HEADER; 

DELETE FROM events 
WHERE "date" >= '2010-01-01' 
AND "date" < '2011-01-01' 
COMMIT; 

自卸插入ArchiveDB:

COPY events FROM '/tmp/events.csv' WITH CSV HEADER; 

希望有所幫助。

+1

剛開始使用postgres,但如果這個工作,它會解決很多我的問題。雖然我不喜歡將數據轉儲到文件中以供再次閱讀......但它可能適用於某些粗略情況。 – 2012-02-18 00:28:24

+0

是的,這將是一個更乾淨的方法來做到這一點與dblink,但正如你在你的問題所述dblink不支持跨數據庫邊界的事務。 – tscho 2012-02-18 00:33:15

相關問題