↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 11 已结束支持。 2023-11-09. 请参阅 当前版本手册.

CREATE SEQUENCE

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 } ]

描述

CREATE SEQUENCE 创建一个新的序列号发生器。这会创建并初始化一个名为 name 的特殊单行表。该发生器归发出该命令的用户所有。

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

创建序列后,可以使用函数 nextval、currval 以及 setval 来操作该序列。这些函数的文档见第 9.16 节。

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

SELECT * FROM name;

来查看序列的参数和当前状态。特别是,序列的 last_value 字段会显示任一会话最近分配的值。(当然,如果其他会话正在调用 nextval,那么到该值被打印出来时,它可能已经过时。)

参数

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 表示不存在这种关联。

注解

使用 DROP SEQUENCE 删除序列。

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

由于 nextval 和 setval 调用从不回滚,如果需要对序列号进行“无间隙”分配,就不能使用序列对象。可以通过对包含计数器的表加排他锁来构造无间隙分配;但这种方案比序列对象昂贵得多,尤其是在许多事务需要并发获取序列号时。

如果对一个将由多个会话并发使用的序列对象设置了大于 1 的 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 扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.