Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 以来是否还有其他会话执行了 nextval,它都会给出可预测的回答。

此函数需要对序列具有 USAGESELECT 权限。

lastval () → bigint

返回本会话中最近由 nextval 返回的值。此函数与 currval 相同,只是它不是将序列名作为参数,而是引用当前会话最近对其应用 nextval 的那个序列。如果当前会话中尚未调用 nextval,则调用 lastval 会报错。

此函数需要对最近使用的序列具有 USAGESELECT 权限。


注意

为避免阻止获得相同序列的号码的并发事务,即使调用事务稍后中止,nextval 获得的值也不会回收再用。这意味着事务中止或数据库崩溃会导致分配值的序列出现间隙。即使没有事务中止,这种情况也会发生。例如,包含 ON CONFLICT 子句的 INSERT 会计算待插入元组,包括进行所有必需的 nextval 调用,然后再检测到任何冲突,该冲突将导致它遵循 ON CONFLICT 规则。因此,PostgreSQL 序列对象不能用于获得“无间隙”序列

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

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

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