序列操作函数 - Amazon Aurora DSQL

序列操作函数

本节介绍用于操作序列对象的函数,也称为序列生成器或就称为序列。序列对象是使用 CREATE SEQUENCE 创建的特殊单行表。序列对象常用于为表的行生成唯一标识符。序列函数提供了简单、多用户安全的方法,用于从序列对象中获取连续的序列值。

重要

使用序列时,应谨慎考虑缓存值。有关更多信息,请参阅 CREATE SEQUENCE 页面上的“重要提示”标注。

有关如何根据工作负载模式以最佳方式使用序列的指导,请参阅使用序列和标识列

函数 说明
nextval ( regclass ) → bigint 使序列对象前进到其下一个值并返回该值。这是以原子方式完成的:即使多个会话同时运行 nextval,每个会话也会安全地接收一个不同的序列值。如果序列对象是使用默认参数创建的,则后续的 nextval 调用将返回从 1 开始递增的值。其它行为可以通过在 CREATE SEQUENCE 命令中使用适当的参数来获得。此函数需要针对序列的 USAGEUPDATE 权限。
setval ( regclass, bigint [, boolean ] ) → bigint 设置序列对象的当前值,并可选设置其 is_called 标志。双参数格式将序列的 last_value 字段设置为指定的值,并将其 is_called 字段设置为 true,这意味着下一个 nextval 将在返回值之前使序列前进。currval 将报告的值也会设置为指定的值。在三参数格式中,is_called 可以设置为 truefalsetrue 与双参数格式效果相同。如果将其设置为 false,则下一个 nextval 将确切返回指定的值,并且序列前进从后一个 nextval 开始。此外,此处并未更改 currval 报告的值。例如:
SELECT setval('myseq', 42); -- Next nextval will return 43 SELECT setval('myseq', 42, true); -- Same as above SELECT setval('myseq', 42, false); -- Next nextval will return 42
setval 返回的结果只是其第二个参数的值。此函数需要针对序列的 UPDATE 权限。
currval ( regclass ) → bigint 返回当前会话中此序列的 nextval 最近获得的值。(如果在此会话中从未为此序列调用过 nextval,则会报告错误。) 由于这会返回会话本地值,因此,无论其它会话是否因为当前会话运行 nextval 而运行了它,都会给出一个可预测的答案。此函数需要针对序列的 USAGESELECT 权限。
lastval () → bigint 返回 nextval 在当前事务中最近返回的值。此函数与 currval 相同(除了它不是将序列名称作为参数),它引用在当前事务中最近应用了 nextval 的任何序列。如果在当前事务中尚未调用 nextval,则调用 lastval 是错误的。此函数需要针对上次使用的序列的 USAGESELECT 权限。
警告

如果发出调用的事务稍后中止,则不会回收 nextval 获得的值以供重用。这意味着,事务中止或数据库崩溃可能会导致已分配值的序列中出现间隙。在不中止事务的情况下,也可能出现这种情况。例如,带有 ON CONFLICT 子句的 INSERT 将计算要插入的元组(包括执行任何必需的 nextval 调用),然后再检测到任何可能导致其遵循 ON CONFLICT 规则的冲突。因此,Aurora DSQL 的序列对象不能用于获取“无间隙”序列

同样,由 setval 所做的序列状态更改会立即对其它事务可见,并且在发出调用的事务回滚时不会撤消。

序列函数要执行操作的序列由 regclass 参数指定,该参数只是序列在 pg_class 系统目录中的 OID。但是,您不必手动查找 OID,因为 regclass 数据类型的输入转换器将为您完成此项工作。有关详细信息,请参阅有关 Object Identifier Types 的 PostgreSQL 文档。