我有一个包含数千行的iSeries表,并且刚刚添加了一个新的数字/整数列作为表Key。这基本上是一个整数id列(1,2,3 ......)。
我们说我不能将此列设为自动递增列。是否有一种简单的方法可以为每行分配唯一的增量值,而无需遍历每个记录分配值?也许是某种UPDATE查询?
答案 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 IDENTITY
到ALTER TABLE
属性,这样该列不再是自动-increment 列。无需创建单独的SEQUENCE。当然,请务必首先进行测试,重复使用将要更改的TABLE,并最好在该副本中使用一小部分数据样本[因此测试实际上也必须处理数据],最后检查DEFAULT和NULL首选项等列的属性;即,DROP IDENTITY
和/或ADD COLUMN
要求可能与下面给出的不同仅仅是一个简单的例子[在v5r3上用DB2 for i5 / OS验证;通过DB2 for IBM i 7.3推测它同样成功:
ALTER COLUMN