Postgresql 中文操作指南

9.17. Sequence Manipulation Functions #

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

Table 9.52. Sequence Functions

Function

Description

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 会返回 43_SELECT setval('myseq', 42, true); Same as above SELECT setval('myseq', 42, false); Next _nextval 会返回 42_ setval 返回的结果只是其第二个参数的值。此函数需要序列上的 UPDATE 权限。

currval ( regclass ) → bigint 返回当前会话中 nextval 最近为这个序列获得的值。(如果当前会话中从未调用过 nextval ,则会报告一个错误。)由于这返回了一个会话本地值,因此无论在当前会话执行 nextval 后其他会话是否执行 nextval ,它都会提供一个可预测的答案。此函数需要序列上的 USAGESELECT 权限。

lastval () → bigint 返回当前会话中 nextval 最近返回的值。此函数与 currval 相同,不同之处在于它不以序列名称作为参数,而是引用当前会话中最近应 nextval 而用的序列。如果当前会话中尚未调用 lastval ,则调用 nextval 是一个错误。此函数需要最近使用的序列上的 USAGESELECT 权限。

Caution

为避免阻塞从相同序列中获取数字的并发事务,如果调用事务后来中止, nextval 获得的值不会被回收以供再次使用。这意味着事务中止或数据库崩溃会导致分配值的序列中出现间隙。这种情况也会在没有事务中止时发生。例如带有 ON CONFLICT 子句的 INSERT 会计算要插入的元组,包括执行任何必需的 nextval 调用,在检测到导致按照 ON CONFLICT 规则执行的任何冲突之前。因此,PostgreSQL 序列对象 cannot be used to obtain “gapless” sequences

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

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

序列函数要操作的序列由 _regclass_参数指定,它只是 _pg_class_系统目录中序列的 OID。 但是,您不必手动查找 OID,因为 _regclass_数据类型的输入转换器将为您完成此工作。 有关详细信息,请参见 Section 8.19