2013-06-19 72 views
2

由於存在用於用戶定義的函數或在紅移存儲過程不支持,我怎樣才能實現在紅移UPSERT機構其使用ParAccel,一個PostgreSQL 8.0.2叉。的Upsert在亞馬遜紅移無功能或存儲過程

目前,我嘗試使用IF實現UPSERT機制... THEN ... ELSE ...語句 e.g: -

IF NOT EXISTS(SELECT...WHERE(SELECT..)) 
       THEN INSERT INTO tblABC() SELECT... FROM tblXYZ 
       ELSE UPDATE tblABC SET.,.,.,. FROM tblXYZ WHERE... 

這是給我的錯誤。因爲我獨立編寫此代碼,而不將其包含在函數或SP中。 那麼,有沒有解決方案來實現UPSERT。

謝謝

+0

感謝您付出的努力。這更清晰;現在我可以告訴你想要什麼。 –

+0

鏈接到紅移文檔:http://docs.aws.amazon.com/redshift/latest/dg/t_updating-inserting-using-staging-tables-.html – Guy

回答

10

你應該讀this article on upsert by depesz。您不能依賴於SERIALIABLE,因爲AFAIK ParAccel不支持完整的可串行化支持,如Pg 9.1+。正如那篇文章所概述的那樣,無論如何,你無法真正地在數據庫中完全實現你想要的。

短的版本是,即使在支持可寫的CTE目前的PostgreSQL版本中,它仍然很難。在基於8.0的ParAccel上,你幾乎不走運。

我會做一個分階段的合併。 COPY將新數據添加到服務器上的臨時表中,LOCK目標表,然後執行UPDATE ... FROM後跟INSERT INTO ... SELECT。以大塊數據上傳數據並鎖定表格以適應Redshift無論如何都是合理的。

另一種方法是通過本地到您的應用程序羣集的外部協調upserts。讓所有工具通過外部工具進行通信,在插入之前他們會採用「插入意向鎖定」。你想要一個適合你的系統的分佈式鎖定工具。如果一切運行在一個應用程序服務器中,它可能就像一個同步的單例對象一樣簡單。

+0

三江源非常多,我已經實現了同樣的事情,COPY到tmp表後面跟着一個UPDATE,然後INSERT INTO ... SELECT。有效。 –