有些人不喜欢Oracle上的序列。为什么?我认为它们非常易于使用且非常好用。您可以在选择,插入,更新......中使用它们。
答案 0 :(得分:5)
总结一下,我喜欢序列,但我更喜欢列的自动增量关键字。
答案 1 :(得分:5)
因为我被DBA迁移数据库,移动所有对象和数据,并错误地重新创建序列,我被咬了好几次,从0开始重新启动它.Hilarity随后......
此外,序列可以在RAC上抛出一个循环,除非您指定希望它们严格增加,否则您将从中获得唯一的数字 - 但不一定是严格增加的顺序(这是因为顺序为了避免每个sequence.nextval调用的节点间通信,每个节点获得一个单独的小片即将到来的数字)。对各种“select max(sequence_id)”查询造成严重破坏。
哦,autoincrement关键字很好,但这只是语法糖 - 另外两个问题是相当严重的“陷阱”。
答案 2 :(得分:5)
我没有。我应该指出,有时人们讨厌他们不理解的东西。
序列对于生成唯一ID非常重要。从概念上讲,拥有一种生成不依赖于表内容的ID的方法很有用。您无需锁定表格即可生成唯一编号。
序列对于在需要唯一的多个表中生成键也很有用。例如,如果我有一个新项目进入系统并且我想一次在一个表中放入一行,我可以从序列中获取ID,当我插入任意数量的表时重用它。正确完成后,我知道ID不会与表中已有的值冲突,并且每行都具有相同的ID。
我认为这些事情也可以使用自动增量列。
答案 3 :(得分:2)
我以前更喜欢自动增量列(ala MySQL,SQL Server和其他),直到我深入了解JPA。此时,自动递增字段的弱点对我来说变得明显:您必须先插入才能获得ID。这是维护对象之间关系的问题。
在JPA中使用Oracle时,只要执行entityManger.persist(object)
,它就会选择下一个序列值并将其指定为ID,而自动递增列则直到提交后才会发生。差异很大。
虽然他们的工作有点困难,我想这就是为什么人们不喜欢它们(或者他们没有看到与自动递增字段相比的优势)。
序列的另一个问题是它们只是松散排序而且很多人都想要绝对排序。我认为这是最大的缺点(无论如何我都可以看到)。
答案 4 :(得分:0)
因为它们比IBM Informix Dynamic Server中的SERIAL列更难使用。
答案 5 :(得分:0)
有些同事不喜欢他们,因为很难记住设置普通香草自动增量场的样板。
幸运的是,SQL Developer会为您填写样板文件,所以现在问题并不是那么糟糕。
答案 6 :(得分:0)
我不讨厌序列。序列太棒了。爱他们!
它们在分布式环境中是安全的;它们可以用来模拟自动增量字段(如果需要的话)(同时还有触发器),同时也可以让你事先得到ID - 这在你准备加载到多个表中并且在插入之前想要ID时很有用。
我接受Jonathan Leffler对他自己的答案的评论,但是 - 对我来说 - 控制的平衡,一个单独的序列为你提供ID生成,相对容易模仿AUTOINCREMENT字段。
答案 7 :(得分:0)
序列的一个问题是,如果你有多个工作者写入同一个表,所有人都从同一个序列获取他们的密钥,结果就是在索引块周围会有争用,工人写的很有可能到同一个街区(意味着他们必须等待)。
对此的一个解决方案是使用反向键索引。
另一种方法是创建一个由类似的东西组成的键 :worker_number || nanoTime()|| RANDOM_NUMBER()
即极有可能提供唯一数字的东西。 (例如,被小行星撞击的地球比获得重复的数字更可能)