本节描述对序列对象进行操作的函数,也称为序列生成器或简称序列。 序列对象是使用CREATE SEQUENCE创建的特殊单行表。 序列对象通常用于为表中的行生成惟一标识符。在Table 9.52中列出的序列函数,提供了简单的、多用户安全方法,用于从序列对象中获取连续的序列值。
Table 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数据类型的输入转换器将为您完成这项工作。 详见Section 8.19
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。