9.17. 序列操作函数 #
本节描述用于操作序列对象(也称为序列生成器,或简称序列)的函数。序列对象是使用 CREATE SEQUENCE 创建的特殊单行表。序列对象通常用于为表中的行生成唯一标识符。在表 9.53 中列出的序列函数,提供了简单的、多用户安全的方法,用于从序列对象中获取连续的序列值。
表 9.53. 序列函数
函数 描述 |
|---|
|
将序列对象推进到下一个值并返回该值。这个操作是原子的:即使多个会话并发地执行
这个函数需要序列上的 |
设置序列对象的当前值,并可选地设置其 SELECT setval('myseq', 42); 下一次
这个函数在序列上需要 |
|
返回当前会话中最近一次针对该序列调用
这个函数需要序列上的 |
|
返回
该函数在最后使用的序列上需要 |
小心
为了避免阻塞从相同序列获取数字的并发事务,nextval 获得的值如果调用事务后续中止,就不会被重新使用。这意味着事务中止或数据库崩溃可能导致分配值序列中的间隙。这也可能发生在没有事务中止的情况下。例如,带有 ON CONFLICT 子句的 INSERT 将计算要插入的元组,包括执行任何必需的 nextval 调用,然后才检测到可能导致其遵循 ON CONFLICT 规则的任何冲突。因此,PostgreSQL 序列对象不能用于获取“无间隙”序列。
同样,setval 函数所做的序列状态更改立即对其他事务可见,并且如果调用事务回滚,则不会被撤消。
如果在包含 nextval 或 setval 调用的事务提交之前,数据库集簇崩溃,那么序列状态更改可能尚未传递到持久存储,因此在集簇重新启动后,无法确定序列是保持其原始状态还是更新状态。对于数据库内部使用序列而言,这是无害的,因为未提交事务的其他影响也不会可见。但是,如果您希望将序列值用于持久性的数据库外部用途,请确保在这样做之前已经提交了 nextval 调用。
序列函数所要操作的序列由 regclass 参数指定,该参数就是序列在 pg_class 系统目录中的 OID。不过,不必手动查找 OID,因为 regclass 数据类型的输入转换器会完成这项工作。详见第 8.19 节。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.