2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CREATE SEQUENCE

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

概要

CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] 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 } ]

描述

CREATE SEQUENCE 创建一个新的序列号生成器。 这涉及创建和初始化一个名为 name 的新的特殊单行表。 该生成器将由发出命令的用户拥有。

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

创建序列后,您可以使用 nextvalcurrvalsetval 函数来操作序列。 这些函数在 第 9.17 节 中有说明。

虽然您无法直接更新序列,但可以使用类似的查询

SELECT * FROM name;

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

参数

TEMPORARYTEMP

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

UNLOGGED

如果指定,则序列将作为非日志序列创建。 对非日志序列的更改不会写入预写日志。 它们不是崩溃安全的:非日志序列在崩溃或不正常关闭后会自动重置为其初始状态。 非日志序列也不会复制到备用服务器。

与非日志表不同,非日志序列不会提供明显的性能优势。 此选项主要用于与非日志表(通过标识列或序列列)关联的序列。 在这些情况下,让序列进行 WAL 日志记录和复制,但其关联的表却没有,通常没有意义。

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 选项允许序列在达到递增或递减序列的 maxvalueminvalue 时循环。 如果达到限制,则生成的下一个数字将分别为 minvaluemaxvalue

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

OWNED BY table_name.column_name
OWNED BY NONE

OWNED BY 选项会导致序列与特定表列关联,以便如果该列(或其整个表)被删除,则序列也会自动删除。 指定的表必须与序列具有相同的拥有者并位于同一模式中。 OWNED BY NONE 是默认值,表示没有这样的关联。

注意

使用 DROP SEQUENCE 删除序列。

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

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

如果对多个会话同时使用的序列对象使用大于一的 cache 设置,则可能会获得意外的结果。 每个会话将在一次访问序列对象期间分配和缓存连续的序列值,并相应地增加序列对象的 last_value。 然后,该会话内接下来的 cache-1 次使用 nextval 只是返回预分配的值,而不会触及序列对象。 因此,在会话中分配但未使用的任何数字都将在该会话结束时丢失,从而导致序列中的“空洞”。

此外,虽然保证多个会话分配不同的序列值,但考虑所有会话时,这些值可能不是按顺序生成的。 例如,如果 cache 设置为 10,则会话 A 可能会保留值 1..10 并返回 nextval=1,然后会话 B 可能会保留值 11..20 并返回 nextval=11,这发生在会话 A 生成 nextval=2 之前。 因此,如果 cache 设置为 1,则可以安全地假设 nextval 值是按顺序生成的; 如果 cache 设置大于 1,则只应假设 nextval 值是不同的,而不是纯粹按顺序生成的。 此外,last_value 将反映任何会话保留的最新值,无论该值是否已由 nextval 返回。

另一个需要考虑的是,对这种序列执行的 setval 不会被其他会话注意到,直到它们用完它们缓存的任何预分配值。

例子

创建一个名为 serial 的递增序列,从 101 开始

CREATE SEQUENCE serial START 101;

从这个序列中选择下一个数字

SELECT nextval('serial');

 nextval
---------
     101

从这个序列中选择下一个数字

SELECT nextval('serial');

 nextval
---------
     102

INSERT 命令中使用此序列

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

COPY FROM 之后更新序列值

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

兼容性

CREATE SEQUENCE 符合SQL标准,但有以下例外

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

  • OWNED BY 子句是 PostgreSQL 扩展。

提交更正

如果您在文档中发现任何错误、与您对特定功能的体验不符或需要进一步说明,请使用此表格报告文档问题。