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