4

有些人不喜欢 Oracle 上的序列。为什么?我认为它们非常易于使用并且非常好。您可以在选择、插入、更新、...中使用它们

4

8 回答 8

5

总而言之,我喜欢序列,但我更喜欢列的自动增量关键字。

于 2009-01-27T01:38:34.570 回答
5

因为我被 DBA 多次迁移数据库、移动所有对象和数据、错误地重新创建序列、从 0 重新启动它。欢闹随之而来……

序列也可以在 RAC 上为循环抛出一个,除非你指定你希望它们严格递增,否则你会从中得到唯一的数字——但不一定是严格递增的顺序(发生这种情况是因为为了避免间- 每个 sequence.nextval 调用的节点通信,每个节点都会获得即将到来的数字的一小部分)。对各种“select max(sequence_id)”查询造成严重破坏。

哦,自动增量关键字很好,但这只是语法糖——另外两个问题是相当严重的“陷阱”。

于 2009-01-27T02:08:25.930 回答
5

我不。我应该指出,有时人们讨厌他们不理解的东西。

序列对于生成唯一 ID 非常重要。从概念上讲,拥有一种生成不依赖于表内容的 ID 的方法很有用。您无需锁定表即可生成唯一编号。

序列对于在需要唯一的多个表中生成键也很有用。例如,如果我有一个新项目进入系统,并且我想一次将一行放入多个表中,我可以从序列中获取一个 ID,并在插入任意数量的表时重复使用它。正确完成后,我知道 ID 不会与表中已有的值冲突,并且每一行都将具有相同的 ID。

我认为这些事情也可以通过自动增量列实现。

于 2009-01-28T02:11:26.907 回答
2

我以前更喜欢自动递增列(ala MySQL、SQL Server 和其他),直到我深入研究 JPA。那时,自动递增字段的弱点对我来说变得很明显:您必须先插入才能获得 ID。这是维护对象之间关系的问题。

在 JPA 中使用 Oracle 时,一旦您这样做entityManger.persist(object),它就会选择下一个序列值并将其分配为 ID,而自动递增列在提交之后才会发生。巨大差距。

不过,它们有点难,我猜这就是人们不喜欢它们的原因(或者他们没有看到与自动递增字段相比的优势)。

序列的另一个问题是它们只是松散的排序,很多人想要绝对排序。我认为这是最大的缺点(无论如何我都能看到)。

于 2009-01-27T02:01:24.650 回答
0

因为它们比 IBM Informix Dynamic Server 中的 SERIAL 列更难使用。

于 2009-01-27T01:34:57.573 回答
0

一些同事不喜欢它们,因为很难记住样板来设置一个普通的自动增量字段。

幸运的是 SQL Developer 会为您填写样板文件,所以现在问题还不错。

于 2009-01-27T03:21:44.660 回答
0

我不讨厌序列。序列很棒。爱他们!

它们在分布式环境中是安全的;它们可用于在需要时模拟自动增量字段(使用触发器),同时还可以让您事先获取 ID - 当您准备将数据集加载到多个表中并且您在插入之前需要 ID 时,这非常有用。

我接受 Jonathan Leffler 对他自己的回答的评论,但是 - 对我来说 - 控制的平衡一个单独的序列为您提供了 ID 生成,并且相对容易模仿 AUTOINCREMENT 字段的工作。

于 2009-01-27T10:48:34.710 回答
0

序列的一个问题是,如果您有多个工作人员写入同一个表,所有工作人员都从同一个序列中获取他们的密钥,结果是索引块周围会出现争用,工作人员很有可能正在写入同一个表阻止(意味着他们必须等待)。

对此的一种解决方案是使用反向键索引。

另一种选择是创建一个由以下内容组成的密钥:worker_number||nanoTime()||random_number()

即极有可能提供唯一数字的东西。(例如地球被小行星撞击比得到重复数字更有可能)

于 2009-01-28T01:46:41.950 回答