什么是序列?我们什么时候需要一个?

问题描述 投票:0回答:3

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

database terminology database-sequence
3个回答
62
投票

主键是表中的一列。

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

序列是某些数据库产品的一个功能,它只是创建唯一的值。它只是增加一个值并返回它。它的特别之处在于:没有事务隔离,因此多个事务无法获得相同的值,增量也不会回滚。如果没有数据库序列,就很难生成唯一的递增数字。

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

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


10
投票

序列将允许您使用唯一的序列化数字填充主键。

它与

serial
auto_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;


8
投票

主键(从技术角度来说)只是一个强制唯一性(以及加快查询性能)的索引。其中有一些语义信息是该行描述的实体的“键”,但仅此而已。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.