On this page
CREATE SEQUENCE
CREATE SEQUENCE —定义一个新的序列发生器
Synopsis
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 } ]
Description
CREATE SEQUENCE
创建一个新的序列号生成器。这涉及创建和初始化名为* name
*的新特殊单行表。生成器将由发出命令的用户所有。
如果指定了架构名称,则会在指定的架构中创建序列。否则,它将在当前架构中创建。临时序列存在于特殊模式中,因此在创建临时序列时无法给出模式名称。序列名称必须不同于同一架构中任何其他序列,表,索引,视图或外部表的名称。
创建序列后,可以使用函数nextval
,currval
和setval
对序列进行操作。这些功能记录在Section 9.16中。
尽管您无法直接更新序列,但可以使用类似以下的查询:
SELECT * FROM name;
检查序列的参数和当前状态。特别是,序列的last_value
字段显示了任何会话分配的最后一个值。 (当然,如果其他会话正在积极进行nextval
调用,则此值在打印时可能已过时.)
Parameters
TEMPORARY
或TEMP
- 如果指定,则仅为此会话创建序列对象,并在会话退出时自动将其删除。存在临时序列时,具有相同名称的现有永久序列是不可见的(在此会话中),除非使用架构限定名称来引用它们。
IF NOT EXISTS
- 如果已经存在同名关系,则不要抛出错误。在这种情况下发出通知。请注意,不能保证现有关系类似于将要创建的序列-它甚至可能不是序列。
name
- 要创建的序列的名称(可选的模式限定)。
data_type
- 可选子句
AS data_type
指定序列的数据类型。有效类型为smallint
,integer
和bigint
。bigint
是默认值。数据类型确定序列的默认最小值和最大值。
- 可选子句
increment
- 可选子句
INCREMENT BY increment
指定将哪个值添加到当前序列值以创建新值。正值将形成一个升序,负值将形成一个降序。预设值为 1.
- 可选子句
minvalue
NO MINVALUE
- 可选子句
MINVALUE minvalue
确定序列可以生成的最小值。如果未提供此子句或指定了NO MINVALUE
,则将使用默认值。升序的默认值为 1.降序的默认值为数据类型的最小值。
- 可选子句
maxvalue
NO MAXVALUE
- 可选子句
MAXVALUE maxvalue
确定该序列的最大值。如果未提供此子句或指定了NO MAXVALUE
,则将使用默认值。升序的默认值是数据类型的最大值。降序的默认值为-1.
- 可选子句
start
- 可选子句
START WITH start
允许序列从任何地方开始。对于升序,默认起始值为*minvalue
,对于降序,默认起始值为maxvalue
*。
- 可选子句
cache
- 可选的子句
CACHE cache
指定要预分配多少序列号并存储在内存中,以加快访问速度。最小值为 1(一次只能生成一个值,即没有缓存),这也是默认值。
- 可选的子句
CYCLE
NO CYCLE
CYCLE
选项允许序列分别以升序或降序到达*maxvalue
或minvalue
时环绕。如果达到限制,则生成的下一个数字将分别是minvalue
或maxvalue
*。
如果指定了NO CYCLE
,则序列达到最大值后对nextval
的任何调用都将返回错误。如果未指定CYCLE
或NO CYCLE
,则默认为NO CYCLE
。
OWNED BY
table_name
.column_name
OWNED BY NONE
OWNED BY
选项使序列与特定的表列相关联,因此,如果该列(或其整个表)被删除,该序列也将被自动删除。指定的表必须具有相同的所有者,并且与序列具有相同的架构。默认值OWNED BY NONE
指定没有这种关联。
Notes
使用DROP SEQUENCE
删除序列。
序列基于bigint
算术,因此范围不能超过八字节整数的范围(-9223372036854775808 至 9223372036854775807)。
因为nextval
和setval
调用永远不会回滚,所以如果需要“无间隙”分配序列号,则不能使用序列对象。通过使用包含计数器的表的互斥锁定,可以构建无缝分配。但是此解决方案比序列对象昂贵得多,尤其是在许多事务同时需要序列号的情况下。
如果将* cache
设置大于 1 的序列对象(将由多个会话同时使用),可能会获得意外的结果。每个会话将在对序列对象的一次访问期间分配和缓存连续的序列值,并相应地增加序列对象的last_value
。然后,在该会话中对nextval
的下一个 cache
* -1 用法仅返回预分配的值,而无需触摸序列对象。因此,会话中分配但未使用的任何数字都将在该会话结束时丢失,从而导致序列中的“漏洞”。
此外,尽管保证多个会话分配不同的序列值,但是当考虑所有会话时,这些值可能会不按 Sequences 生成。例如,在* cache
*设置为 10 的情况下,会话 A 可能会保留值 1..10 并返回nextval
= 1,然后会话 B 可能会保留值 11..20 并返回nextval
= 11,然后会话 A 生成nextval
= 2 。因此,在cache
设置为 1 的情况下,可以安全地假定nextval
值是 Sequences 生成的。 * cache
*设置大于 1 时,您仅应假定nextval
值都是不同的,而不是纯粹按 Sequences 生成它们。同样,last_value
将反映任何会话保留的最新值,而不管nextval
是否返回了该值。
另一个要考虑的是,在其他会话上,除非它们用尽了已缓存的任何预分配值,否则它们不会注意到在此序列上执行的setval
。
Examples
创建一个名为serial
的升序序列,从 101 开始:
CREATE SEQUENCE serial START 101;
从此序列中选择下一个数字:
SELECT nextval('serial');
nextval
---------
101
从此序列中选择下一个数字:
SELECT nextval('serial');
nextval
---------
102
在INSERT
命令中使用以下 Sequences:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
在COPY FROM
之后更新序列值:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
Compatibility
CREATE SEQUENCE
符合 SQL 标准,但以下情况除外:
使用
nextval()
函数而不是标准的NEXT VALUE FOR
表达式来获取下一个值。OWNED BY
子句是 PostgreSQL 扩展。