2012-04-27 52 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