DB2自动生成的列/生成的始终优于顺序

DB2自动生成的列/生成的始终优于顺序,db2,Db2,早些时候,我们使用“始终生成””来生成主键的值。但现在有人建议,我们应该使用序列来填充主键的值,而不是使用“始终生成”。你认为这一变化的原因是什么?这只是选择的问题吗 早期代码: CREATE TABLE SCH.TAB1 (TAB_P INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE), . . ); 现在是了 CREATE TABLE

早些时候,我们使用“始终生成””来生成主键的值。但现在有人建议,我们应该使用序列来填充主键的值,而不是使用“始终生成”。你认为这一变化的原因是什么?这只是选择的问题吗

早期代码:

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生成值。

这可能是为了在表上有大量删除时处理ID

例如:在身份的情况下,如果您的ID是 1. 2. 三,

现在,如果删除记录3,表将 1. 二,

然后,如果您插入一条新记录,则ID将 1. 2. 四,

与此相反,如果您不使用标识列,而是使用代码生成id,那么在删除新插入后,您可以将id计算为max(id)+1,这样id将按顺序排列 1. 2. 三,


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

我倾向于使用标识列而不是序列,但我将为您比较这两个

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

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

一个表只能有一个标识列,因此如果要将多个序列号记录到同一表中的不同列中,序列对象可以处理该问题


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

以下是我在publib网站上找到的内容:

比较标识列和序列

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

标识列具有以下特征:

  • 标识列可以定义为 仅当表格 是创建的。创建表之后, 您不能将其更改为添加 标识列。(但是,现有的 标识列特征可能会 (可以修改。)
  • 标识栏 自动为一个对象生成值 一张桌子
  • 当一个身份 列定义为已生成 始终,使用的值始终是 由数据库管理器生成。 所有申请均不获批准 在测试过程中提供他们自己的价值观 修改文件的内容 桌子
序列对象具有以下特征:

  • 序列对象是数据库 未绑定到任何对象的对象 桌子
  • 序列对象生成 可在中使用的顺序值 任何SQL或XQuery语句
  • 因为可以使用序列对象 任何应用程序都有两种 用于控制 检索数据库中的下一个值 指定的序列和值 在语句之前生成 正在执行。以前的值 表达式返回最近的 为指定对象生成的值 前一语句的顺序 在本届会议期间。下一个 值表达式返回下一个 指定序列的值。这个 使用这些表达式可以 在多个应用程序中使用相同的值 中的SQL和XQuery语句 几张桌子

虽然这不是这两项的全部特征,但这些特征将帮助您根据您的数据库设计和使用数据库的应用程序来确定使用哪一项。

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

max(id)+1?如果ID值为1,2,3,4,现在如果删除2,那么即使在您的情况下,ID的下一个值也将为“5”,我说的是“通过序列生成TAB_P的值”,而不是通过任何计算。在这种情况下,它将是1,3,4,5,除非采取措施重新调整删除行之后所有行的id值,这本身对于大量记录来说是一项非常耗时的任务。+1表示“由于序列是一个独立的对象,它可以为多个表(或任何其他表)生成数字,并且在删除任何表时不受影响”我还想指出,您可以选择使用默认生成的标识列。这将允许您在不破坏其标识值的情况下迁移旧数据。更好的答案是基于“最佳实践”,而不是易于加载和卸载数据。标识列并不神秘,它允许数据库管理应该由数据库管理的内容。