在数据库中使用序列的原因是什么?

时间:2012-10-15 06:53:39

标签: sql database hibernate relational-database

我是DB / Hibernate的新手,找到了代码:

@SequenceGenerator(name = "entSeq", allocationSize = 5, sequenceName = "CODE_SEQ")
...
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entSeq")

设置主键的序列。

为什么序列用于主键值?解决了哪些目标:

  • 提高绩效
  • 添加约束,一些检查
  • 限制ID的整数值的可能值范围,为什么这样做?
  • 为什么要从1开始计算?

我在下面阅读了有关语法和用法的内容:

但没有找到我的问题的答案。

更新

我很高兴阅读:

显示DB理论中存在如何获得主键的唯一ID的问题。这意味着我可以将插入放入表中而不为我自己的主键提供值:

    INSERT INTO suppliers
    (supplier_id, supplier_name)
    VALUES
    (supplier_seq.nextval, 'Kraft Foods');

但我希望所有数据库中都必须存在此功能,而不必强制我提供主键值...

我认为对吗?

UPDATE2:

回答为何使用 START WITH

将序列添加到现有数据库时,此子句非常有用。当一个旧的计划进入 由应用程序使用并且已经消耗了该子句可以合法范围内的一些值 曾经跳过那些消耗的价值。 MINVALUE和MAXVALUE用于指定合法范围但是 START WITH将启动该范围内的序列使用,以便先前生成的值 不会再出现。

UPDATE3: * 序列 *提供http://en.wikipedia.org/wiki/Surrogate_key

2 个答案:

答案 0 :(得分:1)

历史上,有两个主要原因。

  • 避免大表中的ON UPDATE CASCADE出现性能问题。
  • 避免使用宽自然键连接时出现性能问题。

Oracle甚至不支持ON UPDATE CASCADE,因此更新外键引用中使用的值比其他平台更麻烦。

这些表现“问题”现在比20年前严重得多,因为同样大小的表格。 (硬件现在要快得多。)但是我们现在似乎比20年前处理的表更大。

这种性能调整存在一些不良副作用。

  • 通常需要比精心选择的自然键和ON UPDATE CASCADE更多的连接。您可能需要这么多,以至于连接比磁盘读取更昂贵。
  • 当您有20或30个连接时,更容易迷失在连接中。
  • 行很难快速理解。 (读取{1,7,13,255,438}的行比读取{1,库,结帐,255,'书是你的朋友'}的行更难理解。)
  • 通常,数据库设计者会将ID号指定为主键,但不会设置任何其他UNIQUE约束。这使得ID号成为行标识符,而不是行所代表的真实世界的标识符。这可能是问题。

答案 1 :(得分:0)

无法依赖所有数据库的自动生成密钥。与大多数其他数据库不同,Oracle不提供可用于生成顺序主键值的自动递增数据类型。
然而,使用序列和触发器可以实现相同的效果。