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 *的新特殊单行表。生成器将由发出命令的用户所有。

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

创建序列后,可以使用函数nextvalcurrvalsetval对序列进行操作。这些功能记录在Section 9.16中。

尽管您无法直接更新序列,但可以使用类似以下的查询:

SELECT * FROM name;

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

Parameters

如果指定了NO CYCLE,则序列达到最大值后对nextval的任何调用都将返回错误。如果未指定CYCLENO CYCLE,则默认为NO CYCLE

Notes

使用DROP SEQUENCE删除序列。

序列基于bigint算术,因此范围不能超过八字节整数的范围(-9223372036854775808 至 9223372036854775807)。

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

如果将* 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 标准,但以下情况除外:

See Also

ALTER SEQUENCE, DROP SEQUENCE

上一章 首页 下一章