本节描述了用于操作序列对象的函数,也称为序列生成器或简称序列。序列对象是使用CREATE SEQUENCE创建的特殊的单行表。序列对象通常用于为表的行生成唯一的标识符。序列函数(列于表 9.53)提供了从序列对象获取连续序列值的安全、多用户方法。
表 9.53. 序列函数
函数 描述 |
---|
将序列对象推进到下一个值并返回该值。这是原子操作:即使多个会话同时执行 此函数需要序列上的 |
设置序列对象的当前值,并可选地设置其 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 节。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。