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

  • TEMPORARYTEMP

    • 如果指定,则仅为此会话创建序列对象,并在会话退出时自动将其删除。存在临时序列时,具有相同名称的现有永久序列是不可见的(在此会话中),除非使用架构限定名称来引用它们。
  • IF NOT EXISTS

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

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

    • 可选子句AS data_type指定序列的数据类型。有效类型为smallintintegerbigintbigint是默认值。数据类型确定序列的默认最小值和最大值。
  • 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的任何调用都将返回错误。如果未指定CYCLENO CYCLE,则默认为NO CYCLE

  • OWNED BY table_name . column_name
    OWNED BY NONE

    • OWNED BY选项使序列与特定的表列相关联,因此,如果该列(或其整个表)被删除,该序列也将被自动删除。指定的表必须具有相同的所有者,并且与序列具有相同的架构。默认值OWNED BY NONE指定没有这种关联。

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

  • 使用nextval()函数而不是标准的NEXT VALUE FOR表达式来获取下一个值。

  • OWNED BY子句是 PostgreSQL 扩展。

See Also

ALTER SEQUENCE, DROP SEQUENCE