DB2 Auto生成了Column / GENERATED ALWAYS序列的优缺点

时间:2009-06-22 12:29:20

标签: db2

之前我们使用' GENERATED ALWAYS '来生成主键的值。但现在建议我们应该使用序列来填充主键的值,而不是使用“GENERATED ALWAYS”。您认为这种变化的原因是什么?这只是一个选择问题吗?

早期代码:

CREATE TABLE SCH.TAB1
 (TAB_P         INTEGER         NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
.
.
);

现在是

CREATE TABLE SCH.TAB1
 (TAB_P         INTEGER ),
.
.
);

现在插入时,通过序列生成TAB_P的值。

4 个答案:

答案 0 :(得分:5)

我倾向于使用标识列而不是序列,但我会比较两者。

序列可以为任何目的生成数字,而标识列严格附加到表中的列。

由于序列是一个独立的对象,它可以为多个表(或其他任何表)生成数字,并且在删除任何表时不会受到影响。删除具有标识列的表时,没有该标识列最后分配的值的内存。

一个表只能有一个标识列,所以如果你想在同一个表中将多个顺序号记录到不同的列中,序列对象就可以处理它。

数据库中序列号生成器的最常见要求是为行分配技术密钥,该行由标识列很好地处理。对于更复杂的数字生成需求,序列对象提供了更大的灵活性。

答案 1 :(得分:0)

这可能是为了在表上有大量删除的情况下处理id。

例如:如果是身份,如果你的ids是 1 2 3

现在,如果您删除记录3,您的表格将会有 1 2

然后,如果您插入新记录,那么ID就会出现 1 2 4

与此相反,如果您没有使用标识列并使用代码生成id,那么在删除新插入后,您可以将id计算为max(id)+ 1,因此ID将按顺序排列 1 2 3

我想不出任何其他原因,为什么不应该使用标识列。

答案 2 :(得分:0)

这是我在publib网站上找到的东西:

比较IDENTITY列和序列

虽然IDENTITY列和序列之间存在相似之处,但也存在差异。在设计数据库和应用程序时,可以使用每种特性。

标识列具有以下特征:

  • 标识列可以定义为 表格的一部分只有表格 被建造。创建表后, 你不能改变它来添加 身份栏。 (但是,现有的 标识列的特征可能 被改变。)
  • 标识列 自动生成a的值 单桌。
  • 当一个身份 列定义为GENERATED 总是,使用的值总是如此 由数据库管理器生成。 不允许申请 提供自己的价值观 修改内容 表

序列对象具有以下特征:

  • 序列对象是数据库 与任何人无关的对象 表
  • 生成序列对象 可以使用的顺序值 任何SQL或XQuery语句。
  • 因为可以使用序列对象 任何申请,都有两个 用于控制的表达式 检索中的下一个值 指定的顺序和值 在语句之前生成 被执行。以前的价值 表达式最近返回 生成的指定值 先前声明的序列 在本届会议期间。下一个 VALUE表达式返回下一个 指定序列的值。该 使用这些表达式允许 相同的值可用于多个 SQL和XQuery语句 几张桌子。

虽然这些并非这两个项目的所有特征,但这些特性将帮助您根据数据库设计和使用数据库的应用程序确定使用哪些特性。

答案 3 :(得分:-2)

我不知道为什么有人会使用标识列而不是序列。 序列完成同样的事情并且更直接。标识列更加困难,尤其是当您想要将数据卸载和加载到其他环境时。我不打算讨论所有差异,因为可以在手册中找到这些信息,但我可以告诉您,当用户想要将数据从一个环境迁移到另一个环境时,DBA必须几乎总是参与其中参与是因为它可能让用户感到困惑。使用序列时我们没有问题。我们允许用户更新任何模式对象,以便他们可以根据需要更改其序列。