【问题标题】:What is a sequence (Database)? When would we need it?什么是序列(数据库)?我们什么时候需要它?
【发布时间】:2009-10-30 10:46:34
【问题描述】:

即使有主键,为什么还要创建序列?

【问题讨论】:

    标签: database


    【解决方案1】:

    主键是表中的一列。

    主键需要一个唯一的值,它需要来自某个地方。

    序列是一些数据库产品的一个特性,它只是创建唯一值。它只是增加一个值并返回它。它的特殊之处在于:没有事务隔离,所以几个事务不能得到相同的值,增量也不回滚。如果没有数据库序列,就很难生成唯一的递增数字。

    其他数据库产品支持使用递增数字自动初始化的列。

    还有其他方法可以为主键创建唯一值,例如 Guid。

    【讨论】:

    • 如果没有事务隔离,那怎么用呢?
    • id 的生成没有事务隔离。它总是返回序列的下一个值。事务隔离意味着并行事务要么获得相同的值,要么需要等待另一个事务提交才能获得下一个值。这既不是必需的,也不是有用的。
    • 它如何处理删除特定记录?
    • @Prashant:序列本身与记录无关。它只是一个在您需要 ID 时递增的计数器。它甚至不知道 ID 的用途。它根本不“处理”记录的删除。
    【解决方案2】:

    Sequence 将允许您使用唯一的序列号填充主键。

    它与serialauto_incremement 主键的不同之处在于:

    • 它是一个实际的数据库对象(你需要创建它):

      sql> create sequence NAME_OF_YOUR_SEQUENCE;

    • 您可以将独立的权限分配给不同的数据库用户:

      sql> grant select on NAME_OF_YOUR_SEQUENCE to NAME_OF_YOUR_USER;

    • 您可以使用在多个表(不仅仅是一个)中具有不同的唯一编号。假设您有四个带有数字主键的表,并且您希望这四个表中有唯一的数字。您可以为此使用序列,而不必担心实现锁定机制来“手动”完成。

    • 您可以使用alter sequence将其编号更改为您想要的任何值

    • 您可以循环查看其编号

      sql> create sequence NAME_OF_YOUR_SEQUENCE maxvalue 1500 cycle;

    【讨论】:

    • 那么序列与 auto_increment 主键有什么不同呢?或者这实际上是一个序列?
    【解决方案3】:

    主键(在技术上)仅仅是一个强制唯一性(以及加速查询性能)的索引。那里有一些语义信息是该行描述的实体的“关键”,但仅此而已。

    一个序列完全是一个不同的实体;它与表分开存在(就像存储过程一样),并且可以被调用以产生序列号。

    这两者经常一起使用,为没有合理的“本机”键的实体生成自动主键。但它们是两个独立的概念;您可以拥有在插入期间显式填充主键的表,并且您可以拥有用于填充非 PK 列的序列(甚至在存储过程期间强制使用,与插入记录不同)。

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2012-05-15
      • 1970-01-01
      • 2019-07-17
      • 2011-09-20
      相关资源
      最近更新 更多