我正在编写一个清理DB2数据库中的一些数据的VB应用程序。在几个表中,我想更新整个列。例如帐号列。我将所有帐号更改为从1开始,并在列表中向下递增。我希望能够返回旧帐号和新帐号,以便我可以生成某种报告,我可以参考,所以我不会丢失原始值。我这样更新列:
DECLARE @accntnum INT
SET @accntnum = 0
UPDATE accounts
SET @accntnum = accntnum = @accntnum + 1
GO
我有办法将原始的accntnum和新的accntnum同时归还给一张桌子吗?
答案 0 :(得分:2)
DB2有一个真正的nifty feature,您可以从“数据更改语句”中选择数据。这是在DB2 for Linux / Unix / Windows上测试过的,但我认为它至少应该在DB2 for z/OS上运行。
对于您的编号,您也可以考虑创建sequence。然后你的更新将是这样的:
CREATE SEQUENCE acct_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24
;
SELECT accntnum AS new_acct, old_acct
FROM FINAL TABLE (
UPDATE accounts INCLUDE(old_acct INT)
SET accntnum = NEXT VALUE FOR acct_seq, old_acct = accntnum
)
ORDER BY old_acct;
INCLUDE
部分在结果表中创建一个新列,其中包含指定的名称和数据类型,然后您可以像更改任何其他字段一样在update语句中设置值。
答案 1 :(得分:1)
一种可能的解决方案是添加一个额外的列(让我们称之为oldaccntnum
),并在进行更新时将旧值分配给该列。
然后在不再需要它时放下它。
答案 2 :(得分:0)
这就是我要做的事情:
-- create a new table to track the changes.
- with columns identifying a unique key, old-vale, new-value, timestamp
-- create a trigger on the accounts table
to write the old and new values to the new table.
但是,不知道所有条件,可能不值得麻烦。