2012-04-27 56 views
0

我有兩個表TARGET和SOURCE。 我需要更新SOURCE表的行並將更新的行插入到TARGET表中,然後從SOURCE中刪除原始行。 目前,我首先通過SP完全更新SOURCE表,然後在另一個SP中執行移動操作。刪除+插入(移動)DB2舊錶

BEGIN P1: 
insert into TARGET(select * from SOURCE where col=someValue) 
delete from SOURCE where col=someValue; 
END P1 

我也嘗試過類似

insert into TARGET(SELECT * FROM OLD TABLE(DELETE FROM SOURCE WHERE col=someValue)) 

但這並沒有在SP工作。

我認爲這是常見的情況,例如歷史/存檔表,並且必須在DB2中有解決方案。任何人都可以告訴我如何在不影響性能的情況下實現這一點我的意思是SP不應該花很長時間才能運行。我也可以刪除多餘的更新SP。相反,我可以直接將更新的行插入到TARGET中,並從SOURCE中刪除相應的行。另外我建議在單個事務中進行刪除和插入操作。會造成性能損失嗎?

+0

交易總是有性能成本。期。是的,這**需要**進行交易,否則你會遇到一些可怕的風險。此外,請注意,即使您處於交易中,您當前的'移動'SP也不會**'安全地'行事。恐怕我們需要了解更多信息,但是您可能會直接更新沒有中間表的「Target」。 – 2012-04-27 16:58:17

+0

是的,我想插入更新的行並刪除舊行,而沒有在舊行上進行冗餘更新。使用合併的當前更新sp正在花費更少的時間來更新舊錶,並且我不想通過在sp中引入一些單行插入和刪除操作來損失性能。所以我正在尋找一些能夠維持目標表的批量更新和舊錶的相應刪除 – techknowfreak 2012-04-29 14:54:18

+0

什麼類型的列是'col',_must_它是唯一的嗎?如果它不會是唯一的,那麼你需要使用某種標誌值,這樣你就可以知道哪些行已經插入到'TARGET'中,否則你可能會在'INSERT'之後將行插入'SOURCE'中,但是_before_ 'DELETE' ...具有預期的結果。儘管如此,不要打折SP可能仍然可以接受而沒有嘗試它的可能性。 – 2012-04-30 15:35:09

回答

1

如果我正確理解你的問題,而這些都是所有更新,你可以創建一個TRIGGER把舊行到審覈表(雖然,它不只是UPDATE是你們等可以定義觸發的。INSERT和以及DELETE也是可觸發的)。例如:

CREATE TRIGGER AUDIT_SOURCE 
AFTER UPDATE ON SOURCE 
REFERENCING OLD AS O 
FOR EACH ROW 
BEGIN ATOMIC 
    INSERT INTO TARGET 
    VALUES (O.Col1, O.Col2, ..., O.ColN); 
END 
+0

這不是審計表,而是歷史表。我必須從源刪除行。但在刪除它們之前,我必須將它們的更新版本插入到歷史記錄表中。 – techknowfreak 2012-04-29 15:03:30