是否可以为iSeries表中的每一行生成唯一的数值而不进行循环?

时间:2012-02-20 19:01:29

标签: sql db2 ibm-midrange

我有一个包含数千行的iSeries表,并且刚刚添加了一个新的数字/整数列作为表Key。这基本上是一个整数id列(1,2,3 ......)。

我们说我不能将此列设为自动递增列。是否有一种简单的方法可以为每行分配唯一的增量值,而无需遍历每个记录分配值?也许是某种UPDATE查询?

3 个答案:

答案 0 :(得分:4)

您可以使用RRN标量函数指定相对记录号:

update table set id=rrn(table)

答案 1 :(得分:4)

您可以使用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()那样快,但在某些情况下可能很有用,例如当您希望数字在不同的表中具有唯一性时。

答案 2 :(得分:0)

最简单[和最快]可能是添加新列 [不能是自动增量列],将列添加为{{ 1}} [因此是自动增量列],然后是该列的GENERATED ALWAYS AS IDENTITYALTER TABLE属性,这样该列不再是自动-increment 列。无需创建单独的SEQUENCE。当然,请务必首先进行测试,重复使用将要更改的TABLE,并最好在该副本中使用一小部分数据样本[因此测试实际上也必须处理数据],最后检查DEFAULT和NULL首选项等列的属性;即,DROP IDENTITY和/或ADD COLUMN要求可能与下面给出的不同仅仅是一个简单的例子[在v5r3上用DB2 for i5 / OS验证;通过DB2 for IBM i 7.3推测它同样成功:

ALTER COLUMN