本节介绍用于操作序列对象(也称为序列生成器或序列)的函数。序列对象是使用 CREATE SEQUENCE 创建的特殊单行表。序列对象通常用于为表中的行生成唯一标识符。序列函数(列在 表 9.52 中)提供简单、多用户安全的方法,用于从序列对象获取连续的序列值。
表 9.52. 序列函数
函数 说明 |
---|
将序列对象推进到其下一个值并返回该值。这是原子操作:即使多个会话同时执行 此函数需要序列上的 |
设置序列对象的当前值,以及可选的 SELECT setval('myseq', 42); Next
此函数需要序列上的 |
返回当前会话中此序列最近通过 此函数需要序列上的 |
返回当前会话中最近由 此函数需要对上次使用的序列的 |
为了避免阻止从同一序列获取数字的并发事务,如果调用事务稍后中止,则不会回收通过 nextval
获取的值以供重新使用。这意味着事务中止或数据库崩溃会导致分配值序列中的间隙。即使没有事务中止,也会发生这种情况。例如,带有 ON CONFLICT
子句的 INSERT
将计算待插入元组,包括执行任何必需的 nextval
调用,然后再检测到任何冲突,从而导致它遵循 ON CONFLICT
规则。因此,PostgreSQL 序列对象不能用于获取“无间隙”序列。
同样,由 setval
做出的序列状态更改对于其他事务是立即可见的,并且如果调用事务回滚,则不会撤消这些更改。
如果在提交包含 nextval
或 setval
调用的事务之前数据库集群崩溃,则序列状态更改可能尚未进入持久性存储,因此在集群重新启动后不确定序列将具有其原始状态还是更新状态。对于在数据库中使用序列来说这是无害的,因为未提交的事务的其他影响也不会可见。但是,如果您希望将序列值用于数据库外部的持久性目的,请确保在这样做之前已提交 nextval
调用。
由序列函数操作的序列由 regclass
参数指定,该参数只是 pg_class
系统目录中序列的 OID。但是,您不必手动查找 OID,因为 regclass
数据类型的输入转换器将为您完成这项工作。有关详细信息,请参见 第 8.19 节。