2012-02-20 37 views

回答

4

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

update table set id=rrn(table) 
+0

+1我删除了我的答案,因为它没有添加任何值。 – Paparazzi 2012-02-20 22:37:53

+0

如果物理文件设置为不重复使用已删除的记录,然后有人在其上执行了RGZPFM,是否可以导致RRN发生更改,从而允许ID列中出现重复值的可能性? – 2012-02-29 19:04:20

+0

@Tracy如果文件得到重新组织,RRN解决方案不会持续正常工作。在这种情况下,他们可以使用RRN来初始分配键,然后使用子查询来计算MAX(id)+ 1。 – jamesallman 2012-02-29 19:16:20

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

+0

在一些快速测试中,我发现这种方法很容易使用MAX(id)。 – WarrenT 2013-01-17 00:44:03

0

也许最简单的[和最​​快]是,添加新的列 [即不能是一个自动增量柱]时,要添加列GENERATED ALWAYS AS IDENTITY [从而是一个自动增量柱],然后ALTER TABLEDROP 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 
    ; 
相关问题