什么是序列(数据库)?我们什么时候需要它?
主键周期表中的一列。
主键需要一个独特的值,它需要来自某个地方。
该序列是一些数据库产品的一项功能,它只创建独特的值。它只是增加一个值并返回它。关于它的特别之处是:没有事务隔离,所以多个事务不能获得相同的值,增量也不会回滚。没有数据库序列,很难生成唯一的递增数字。
其他数据库产品支持使用递增数字自动初始化的列。
还有其他方法可以为主键创建唯一值,例如Guids。
序列将允许您使用唯一序列号填充主键。
这是不同的从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;
那么序列与auto_increment主键有什么不同呢?或者这实际上是一个序列? – Blaise 2018-02-01 09:22:39
查看我更新的答案@Blaise – 2018-02-01 10:54:59
主键(在技术上)仅仅是一个强制唯一性(以及加快查询性能)的索引。这里有一些语义信息是行描述的实体的“关键”,但就是这样。
一个序列完全是一个不同的实体;它与表格分开存在(就像存储过程一样),并且可以调用它来产生连续的数字。
这两者经常一起使用,为没有明智的“原生”键的实体生成自动主键。但他们是两个不同的概念;您可以在插入过程中使用主键明确填充的表格,并且可以使用用于填充非PK列的序列(甚至在存储过程中强制使用,与插入记录不同)。
如果没有事务隔离,那么它如何被使用? – rapt 2011-10-25 00:10:31
生成ID没有事务隔离。它总是返回序列的下一个值。事务隔离意味着并行事务要么获得相同的值,要么需要等待另一个事务提交才能获得下一个值。这既不需要也不有用。 – 2011-10-26 11:18:37