支持的版本:当前 (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

9.17. 序列操作函数 #

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

表 9.53. 序列函数

函数

描述

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,它都会给出可预测的答案。

此函数需要序列的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 节

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。