2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

9.17.序列操作函数 #

本节介绍用于操作序列对象(也称为序列生成器或简称序列)的函数。序列对象是使用 CREATE SEQUENCE 创建的特殊单行表。序列对象通常用于为表中的行生成唯一标识符。序列函数(列于 表 9.55 中)提供简单、多用户安全的从序列对象获取连续序列值的方法。

表 9.55. 序列函数

函数

描述

nextval ( regclass ) → bigint

将序列对象推进到下一个值并返回该值。这是原子操作:即使多个会话并发执行 nextval,每个会话也会安全地获得一个不同的序列值。如果序列对象是使用默认参数创建的,则连续调用 nextval 将返回从 1 开始的连续值。通过在 CREATE SEQUENCE 命令中使用适当的参数可以获得其他行为。

此函数需要序列的 USAGEUPDATE 权限。

setval ( regclass, bigint [, boolean ] ) → bigint

设置序列对象的当前值,以及可选的 is_called 标志。双参数形式将序列的 last_value 字段设置为指定值,并将其 is_called 字段设置为 true,这意味着下一个 nextval 将在返回一个值之前推进序列。 currval 将报告的值也设置为指定值。在三参数形式中,is_called 可以设置为 truefalsetrue 的效果与双参数形式相同。如果设置为 false,则下一个 nextval 将正好返回指定值,序列的推进从接下来的 nextval 开始。此外,在这种情况下, currval 报告的值不会改变。例如,

SELECT setval('myseq', 42);           Next nextval will return 43
SELECT setval('myseq', 42, true);     Same as above
SELECT setval('myseq', 42, false);    Next nextval will return 42

setval 返回的结果只是其第二个参数的值。

此函数需要序列的 UPDATE 权限。

currval ( regclass ) → bigint

返回当前会话中此序列的 nextval 最近一次获取的值。(如果在此会话中从未为该序列调用过 nextval,则会报告错误。)由于这会返回一个会话本地的值,因此无论其他会话自当前会话执行 nextval 以来是否执行了 nextval,它都会给出可预测的答案。

此函数需要序列的 USAGESELECT 权限。

lastval () → bigint

返回当前会话中 nextval 最近一次返回的值。此函数与 currval 相同,但它不接受序列名称作为参数,而是引用当前会话中最近应用 nextval 的序列。如果当前会话尚未调用 nextval,则调用 lastval 是错误的。

此函数需要最后使用的序列的 USAGESELECT 权限。


注意

为了避免阻塞从同一序列获取数字的并发事务,如果调用事务稍后中止, nextval 获取的值不会被收回重用。这意味着事务中止或数据库崩溃可能导致分配值序列中出现间隙。没有事务中止也可能发生这种情况。例如,带有 ON CONFLICT 子句的 INSERT 将在检测到任何导致其遵循 ON CONFLICT 规则的冲突之前,计算要插入的元组,包括执行任何必需的 nextval 调用。因此, PostgreSQL 序列对象不能用于获取无间隙序列

同样, setval 对序列状态所做的更改会立即对其他事务可见,并且如果调用事务回滚,则不会撤销。

如果在提交包含 nextvalsetval 调用的事务之前数据库集群崩溃,则序列状态更改可能尚未写入持久存储,因此在集群重启后序列具有原始状态还是更新状态是不确定的。这对于在数据库中使用序列是无害的,因为未提交事务的其他影响也同样不可见。但是,如果您希望将序列值用于数据库之外的持久目的,请确保在这样做之前已提交 nextval 调用。

要由序列函数操作的序列由 regclass 参数指定,该参数只是 pg_class 系统目录中序列的 OID。但是,您不必手动查找 OID,因为 regclass 数据类型的输入转换器会为您完成这项工作。有关详细信息,请参阅 第 8.19 节

提交更正

如果您在文档中发现任何不正确之处、与您在使用特定功能时的实际体验不符之处或需要进一步说明之处,请使用 此表单 报告文档问题。