我有一个包含数千行的iSeries表,并且新的数字/整数列仅作为表键添加。这基本上是一个整数id列(1,2,3 ...)。是否可以为没有循环的iSeries表中的每一行生成一个唯一的数值?
假设我不能将此列设置为自动递增列。是否有一种简单的方法可以为每行分配唯一的增量值,而无需遍历每个赋值的记录?也许某种更新查询?
我有一个包含数千行的iSeries表,并且新的数字/整数列仅作为表键添加。这基本上是一个整数id列(1,2,3 ...)。是否可以为没有循环的iSeries表中的每一行生成一个唯一的数值?
假设我不能将此列设置为自动递增列。是否有一种简单的方法可以为每行分配唯一的增量值,而无需遍历每个赋值的记录?也许某种更新查询?
可以使用RRN标量函数指定的相对记录号:
update table set id=rrn(table)
你可以使用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()一样快,但在某些情况下可能有用,例如当您希望在不同表格中有唯一的数字时。
在一些快速测试中,我发现这种方法很容易使用MAX(id)。 – WarrenT 2013-01-17 00:44:03
也许最简单的[和最快]是,添加新的列 [即不能是一个自动增量柱]时,要添加列GENERATED ALWAYS AS IDENTITY
[从而是一个自动增量柱],然后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
;
+1我删除了我的答案,因为它没有添加任何值。 – Paparazzi 2012-02-20 22:37:53
如果物理文件设置为不重复使用已删除的记录,然后有人在其上执行了RGZPFM,是否可以导致RRN发生更改,从而允许ID列中出现重复值的可能性? – 2012-02-29 19:04:20
@Tracy如果文件得到重新组织,RRN解决方案不会持续正常工作。在这种情况下,他们可以使用RRN来初始分配键,然后使用子查询来计算MAX(id)+ 1。 – jamesallman 2012-02-29 19:16:20