有人可以启发为什么oracle不支持主键的自动增量功能?
我知道在序列和触发器的帮助下可以实现相同的功能,但是为什么oracle没有引入autoincrement关键字,它将在内部创建序列和触发器。我打赌oracle中的人肯定会想到这个。必须有一些理由不提供此功能。有什么想法吗?
答案 0 :(得分:15)
它可能只是术语。 'AUTOINCREMENT'意味着记录'103'将在记录'102'和'104'之间创建。在集群环境中,序列不一定是这种情况。一个节点可以插入“100”,“101”,“102”而另一个节点插入“110”,“111”,“112”,因此记录“乱序”。 [当然,术语'序列'具有相同的含义。]
如果您选择不遵循序列模型,则会引入锁定和序列化问题。在确定下一个值是什么之前,您是否强制插入等待另一个插入的提交/回滚,或者您是否接受,如果事务回滚,则会在键中产生间隙。
如果有人想在表中插入一行,并且该字段具有特定值(即允许它,或者它是否像DEFAULT一样工作),或者有人试图更新它,那么就会出现问题。如果有人插入'101',自动增量是否会'跳'到'102',或者您是否有尝试重复值的风险。
它可能会影响其IMP实用程序和直接路径写入以及向后兼容性。
我不是说不能这样做。但我怀疑最终有人看过它并决定他们可以在其他地方更好地度过开发时间。
编辑添加:
在Oracle 12.1中,添加了对IDENTITY列的支持。
“对于每个后续的INSERT语句,将为序列生成器分配一个递增或递减的整数值。您可以使用identity_options子句配置序列生成器。”
https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#CJAHJHJC
答案 1 :(得分:5)
因为它有sequences,它可以做一切自动增量,然后一些。
答案 2 :(得分:5)
在各个数据库阵营之间,这已经成为争论的焦点。对于像Oracle一样精心打造的数据库系统,它仍然让我觉得它需要很多代码和工作来启用这个常用且有价值的功能。
我建议您在工具包中添加一些增量主键构建器/功能/工具,并将其用于Oracle工作。并写下你的国会议员并告诉他他们需要从GUI或使用单行SQL提供这个功能有多糟糕!
答案 3 :(得分:1)
许多人抱怨这一点,但答案通常是你可以通过序列和触发器轻松创建一个。
答案 4 :(得分:-1)
序列可能很容易失去同步(有人在数据库中手动插入记录而不更新序列)。 Oracle应该在很久以前就已经实现了! 序列易于使用,但不像自动增量那么容易(它们需要额外的编码)。