什么是序列(数据库)?我们什么时候需要它?

Mat*_*rix 35 database

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

Ste*_*ger 46

主键是表中的列.

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

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

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

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

  • 生成id时没有事务隔离.它始终返回序列的下一个值.事务隔离意味着并行事务要么获得相同的值,要么需要等待另一个事务提交才能获得下一个值.这既不是必需的也不是有用的. (4认同)
  • @Prashant:序列本身与记录根本无关。它只是一个在您需要 ID 时递增的计数器。它甚至不知道 ID 用于什么。它根本不“处理”记录的删除。 (2认同)

And*_*yle 7

主键(在技术术语中)仅仅是一个强制唯一性(以及加快查询性能)的索引.那里有一些语义信息是行描述的实体的"关键",但就是这样.

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

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


Pab*_*ruz 6

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

这是从不同的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;