Sql 删除+;插入(移动)DB2旧表
我有两个表TARGET和SOURCE。 我需要更新源表的行,并将更新后的行插入目标表,然后从源表中删除原始行。 目前,我首先通过SP完全更新源表,然后在另一个SP中执行移动操作Sql 删除+;插入(移动)DB2旧表,sql,stored-procedures,db2,batch-processing,Sql,Stored Procedures,Db2,Batch Processing,我有两个表TARGET和SOURCE。 我需要更新源表的行,并将更新后的行插入目标表,然后从源表中删除原始行。 目前,我首先通过SP完全更新源表,然后在另一个SP中执行移动操作 BEGIN P1: insert into TARGET(select * from SOURCE where col=someValue) delete from SOURCE where col=someValue; END P1 我也试过类似的东西 insert into TARGET(SELECT * FROM
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。相反,我可以直接将更新的行插入目标并从源中删除相应的行。还有人建议我在单个事务中执行删除和插入操作。这会导致性能损失吗?如果我正确理解了您的问题,并且这些都是更新,那么您可以创建一个将旧行放入审核表中的方法(不过,您可以定义触发器的不仅仅是
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
事务总是有性能成本。时期是的,这需要在交易中进行,否则你会面临一些可怕的风险。此外,请注意,您当前的“移动”SP即使在事务中也不会“安全”运行。恐怕我们需要了解更多信息才能确定,但您可能可以直接更新
Target
,而无需中间表。是的,我希望插入更新的行并删除旧行,而不需要对旧行进行冗余更新。当前使用merge的更新sp更新旧表所用的时间更少,我不想在sp中引入一些单行插入和删除操作而失去性能。因此,我正在寻找一些可以维护目标表的批量更新以及从旧表中相应删除的内容列的类型是什么col
,它必须是独一无二的吗?如果它不是唯一的,您需要使用某种标志值,这样您就可以知道哪些行已插入到目标
,或者您有可能在插入
之后,但在删除
之前,将行插入源
。。。取得了预期的效果。尽管如此,不要低估SP在不尝试的情况下仍能正常运行的可能性。这不是审计表,而是某种历史记录表。我必须从源代码中删除行。但在删除它们之前,我必须将它们的更新版本插入到历史记录表中。