【发布时间】:2012-02-20 19:01:29
【问题描述】:
我有一个包含数千行的 iSeries 表,并且刚刚添加了一个新的数字/整数列作为表键。这基本上是一个整数 id 列(1,2,3...)。
假设我无法将此列设为自动递增列。有没有一种简单的方法可以为每一行分配唯一的增量值,而不必遍历每条记录来分配值?也许是某种 UPDATE 查询?
【问题讨论】:
标签: sql db2 ibm-midrange
我有一个包含数千行的 iSeries 表,并且刚刚添加了一个新的数字/整数列作为表键。这基本上是一个整数 id 列(1,2,3...)。
假设我无法将此列设为自动递增列。有没有一种简单的方法可以为每一行分配唯一的增量值,而不必遍历每条记录来分配值?也许是某种 UPDATE 查询?
【问题讨论】:
标签: sql db2 ibm-midrange
您可以使用RRN 标量函数来分配相对记录号:
update table set id=rrn(table)
【讨论】:
MAX(id) + 1。
您可以使用 Sequence 对象。例如
CREATE SEQUENCE MySeq
as {numeric-datatype}
数据类型可以是 SMALLINT、INTEGER、BIGINT、DECIMAL 或 NUMERIC,小数位数为零(即没有小数位)。创建一个数据区域来存储值。
然后您可以使用NEXT VALUE FOR 表达式来检索和递增序列,如下所示
UPDATE MyTable SET id = NEXT VALUE FOR MySeq
如果您想知道最后分配的值,可以使用表达式Previous value for mySeq
此方法不如 RRN() 快,但在某些情况下可能很有用,例如当您希望在不同表中具有唯一的数字时。
【讨论】:
可能最简单 [最快] 是,添加新列时 [不能是自动增量 列],将列添加为@987654321 @ [因此是一个自增列],然后是 ALTER TABLE 到该列的 DROP IDENTITY 属性,这样该列不再是自增列柱子。也无需创建单独的 SEQUENCE。当然,请务必先进行测试,使用将要更改的 TABLE 的副本,并且最好在该副本中也使用一小部分数据样本[因此测试实际上也必须处理数据],最后查看列属性以获取 DEFAULT 和 NULL 首选项等内容;即ADD COLUMN 和/或ALTER COLUMN 要求可能与以下仅作为简单示例给出的不同[在 v5r3 上使用 DB2 for i5/OS 验证;假设通过 DB2 for IBM i 7.3 一样成功]:
alter table has_no_id /* err, will have ID column, afterward */
add column id_added integer generated always as identity
;
alter table has_no_id /* err, will since, have no ID column */
alter column id_added drop identity
;
【讨论】: