本节描述对sequence objects进行操作的函数,也称为序列生成器或序列。 序列对象是使用CREATE SEQUENCE创建的特殊单行表。 序列对象通常用于为表中的行生成惟一标识符。在表 9.51中列出的序列函数,提供了简单的、多用户安全方法,用于从序列对象中获取连续的序列值。
表 9.51. 序列函数
函数 描述 |
---|
将序列对象推进到下一个值并返回该值。这是自动完成的:即使多个会话并发地执行
这个函数需要 |
设置序列对象的当前值,以及可选的它的 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 节