# 创建序列

CREATE SEQUENCE — 定义一个新的序列生成器

# 概要

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]

# 描述

创建序列创建一个新的序列号生成器。这涉及创建和初始化一个新的特殊单行表,其名称为*姓名*.生成器将归发出命令的用户所有。

如果给定模式名称,则在指定模式中创建序列。否则,它会在当前模式中创建。临时序列存在于一个特殊的模式中,因此在创建临时序列时不能给出模式名称。序列名称必须与同一架构中的任何其他序列、表、索引、视图或外部表的名称不同。

创建序列后,您可以使用函数下一个瓦尔,曲线, 和设定值对序列进行操作。这些功能记录在第 9.17 节.

虽然您不能直接更新序列,但您可以使用如下查询:

SELECT * FROM name;

检查序列的参数和当前状态。特别是,最后一个值序列的字段显示任何会话分配的最后一个值。(当然,如果其他会话正在积极执行,则此值可能在打印时已过时下一个瓦尔来电。)

# 参数

暂时的要么温度

如果指定,则仅为此会话创建序列对象,并在会话退出时自动删除。当临时序列存在时,具有相同名称的现有永久序列不可见(在此会话中),除非它们被模式限定名称引用。

如果不存在

如果已存在同名关系,则不要抛出错误。在这种情况下发出通知。请注意,不能保证现有关系与已创建的序列类似——它甚至可能不是序列。

姓名

要创建的序列的名称(可选模式限定)。

数据类型

可选条款作为 *数据类型*指定序列的数据类型。有效类型是小字,整数, 和大整数.大整数是默认值。数据类型决定了序列的默认最小值和最大值。

增量

可选条款增加 *增量*指定将哪个值添加到当前序列值以创建新值。正值表示升序,负值表示降序。默认值为 1.

最小值
没有最小值

可选条款最小值 *最小值*确定序列可以生成的最小值。如果未提供此条款或没有最小值指定,然后将使用默认值。升序的默认值为 1.降序的默认值为数据类型的最小值。最大值

没有最大值
可选条款

最大值 *最大值*确定序列的最大值。如果未提供此条款或没有最大值指定,则将使用默认值。升序的默认值是数据类型的最大值。降序序列的默认值为 -1.开始

可选条款

从...开始 *开始*允许序列从任何地方开始。默认起始值​​为最小值*对于升序和最大值对于下降的。*缓存

可选条款

缓存 *缓存*指定要预分配多少序列号并将其存储在内存中以便更快地访问。最小值为 1(一次只能生成一个值,即不缓存),这也是默认值。

循环
无循环

循环选项允许序列回绕时*最大值或者最小值已分别通过升序或降序到达。如果达到限制,生成的下一个数字将是最小值或者最大值*, 分别。

如果无循环指定,任何调用下一个瓦尔序列达到最大值后将返回错误。如果两者都没有循环或者无循环被指定,无循环是默认值。

拥有者 表名.列名
不属于任何人

拥有者选项使序列与特定表列相关联,这样如果删除该列(或其整个表),该序列也将自动删除。指定的表必须与序列具有相同的所有者并且在相同的模式中。不属于任何人,默认值,指定没有这样的关联。

# 笔记

采用删除序列删除一个序列。

序列基于大整数算术,所以范围不能超过一个八字节整数的范围(-9223372036854775808 到 9223372036854775807)。

因为下一个瓦尔设定值调用永远不会回滚,如果需要“无缝”分配序列号,则不能使用序列对象。可以通过使用包含计数器的表的排他锁定来构建无间隙分配;但是这种解决方案比序列对象要昂贵得多,尤其是在许多事务同时需要序列号的情况下。

可能会得到意想不到的结果,如果*缓存设置大于 1 用于将由多个会话同时使用的序列对象。每个会话将在一次访问序列对象期间分配和缓存连续的序列值,并增加序列对象的最后一个值因此。那么,接下来缓存*-1 的用途下一个瓦尔在该会话中,只需返回预分配的值而不触及序列对象。因此,在会话结束时,任何分配但未在会话中使用的号码都将丢失,从而导致序列中的“漏洞”。

此外,尽管保证多个会话分配不同的序列值,但当考虑所有会话时,这些值可能会乱序生成。例如,与*缓存设置为 10,会话 A 可能保留值 1..10 并返回下一个瓦尔=1,则会话 B 可能保留值 11..20 并返回下一个瓦尔=11 在会话 A 生成之前下一个瓦尔=2.因此,与缓存设置为 1 可以安全地假设下一个瓦尔值是按顺序生成的;与缓存*设置大于一,你应该只假设下一个瓦尔值都是不同的,并不是说它们是纯粹按顺序生成的。还,最后一个值将反映任何会话保留的最新值,无论它是否已被返回下一个瓦尔.

另一个考虑是,一个设定值在这样的序列上执行的其他会话不会注意到它们,直到它们用完它们缓存的任何预分配值。

# 例子

创建一个升序,称为串行,从 101 开始:

CREATE SEQUENCE serial START 101;

从此序列中选择下一个数字:

SELECT nextval('serial');

 nextval
## Compatibility

`CREATE SEQUENCE` conforms to the SQL standard, with the following exceptions:

* Obtaining the next value is done using the `nextval()` function instead of the standard's `NEXT VALUE FOR` expression.

* The `OWNED BY` clause is a PostgreSQL extension.

## See Also

[ALTER SEQUENCE](sql-altersequence.html), [DROP SEQUENCE](sql-dropsequence.html)