是否可以在不循环的情况下为 iSeries 表中的每一行生成唯一的数值?

Posted

技术标签:

【中文标题】是否可以在不循环的情况下为 iSeries 表中的每一行生成唯一的数值?【英文标题】:Is it possible to generate a unique numeric value for each row in an iSeries table without looping? 【发布时间】:2012-02-20 19:01:29 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

您可以使用RRN 标量函数来分配相对记录号:

update table set id=rrn(table)

【讨论】:

如果物理文件设置为不重复使用已删除的记录,然后有人对其进行了 RGZPFM,这是否会导致 RRN 发生更改,从而允许 ID 列中出现重复值? @Tracy 你是对的,如果文件得到重组,RRN 解决方案将无法持续工作。在这种情况下,他们可以使用 RRN 最初分配密钥,然后使用子查询来计算 MAX(id) + 1 我尝试在“中等”大小的文件上获取 MAX(id),并在 Visual Explain 中看到系统扫描索引以计算 MAX(id)。这可能被认为是一件坏事(尽管比表扫描好得多)。 SEQUENCE 解决方案在我的测试中快了 10 倍以上,但是 YMMV。【参考方案2】:

您可以使用 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) 的方法。【参考方案3】:

可能最简单 [最快] 是,添加新列时 [不能是自动增量 列],将列添加为@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 
  ;

【讨论】:

以上是关于是否可以在不循环的情况下为 iSeries 表中的每一行生成唯一的数值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改 pvalue 的情况下为 kruskal wallis 测试执行循环比较多列上的 3 个组?

是否可以在没有自动布局的情况下为 iPad 设计视图?

如何在不涉及 Android 客户端应用程序的开发人员的情况下为某些网站构建公共/私有 API [关闭]

如何在不添加另一个 UIView 的情况下为情节提要中的 uitableViewCell 制作等宽分隔符?

如何在不为其创建专用网站的情况下为我的应用提供隐私政策?

如何在不使用对话框的情况下为 C# 项目中的 MySQL 数据库设置连接字符串?