2009-10-30 152 views

回答

32

主键周期表中的一列。

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

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

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

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

+0

如果没有事务隔离,那么它如何被使用? – rapt 2011-10-25 00:10:31

+4

生成ID没有事务隔离。它总是返回序列的下一个值。事务隔离意味着并行事务要么获得相同的值,要么需要等待另一个事务提交才能获得下一个值。这既不需要也不有用。 – 2011-10-26 11:18:37

3

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

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

+0

那么序列与auto_increment主键有什么不同呢?或者这实际上是一个序列? – Blaise 2018-02-01 09:22:39

+1

查看我更新的答案@Blaise – 2018-02-01 10:54:59

5

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

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

这两者经常一起使用,为没有明智的“原生”键的实体生成自动主键。但他们是两个不同的概念;您可以在插入过程中使用主键明确填充的表格,并且可以使用用于填充非PK列的序列(甚至在存储过程中强制使用,与插入记录不同)。

相关问题