之前我们使用' 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的值。
答案 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列和序列之间存在相似之处,但也存在差异。在设计数据库和应用程序时,可以使用每种特性。
标识列具有以下特征:
序列对象具有以下特征:
虽然这些并非这两个项目的所有特征,但这些特性将帮助您根据数据库设计和使用数据库的应用程序确定使用哪些特性。
答案 3 :(得分:-2)
我不知道为什么有人会使用标识列而不是序列。 序列完成同样的事情并且更直接。标识列更加困难,尤其是当您想要将数据卸载和加载到其他环境时。我不打算讨论所有差异,因为可以在手册中找到这些信息,但我可以告诉您,当用户想要将数据从一个环境迁移到另一个环境时,DBA必须几乎总是参与其中参与是因为它可能让用户感到困惑。使用序列时我们没有问题。我们允许用户更新任何模式对象,以便他们可以根据需要更改其序列。