

# 序列操作函数
<a name="sequence-functions-syntax-support"></a>

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

**重要**  
使用序列时，应谨慎考虑缓存值。有关更多信息，请参阅 [`CREATE SEQUENCE`](create-sequence-syntax-support.md) 页面上的“重要提示”标注。  
有关如何根据工作负载模式以最佳方式使用序列的指导，请参阅[使用序列和标识列](sequences-identity-columns-working-with.md)。


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

**警告**  
如果发出调用的事务稍后中止，则不会回收 `nextval` 获得的值以供重用。这意味着，事务中止或数据库崩溃可能会导致已分配值的序列中出现间隙。在不中止事务的情况下，也可能出现这种情况。例如，带有 `ON CONFLICT` 子句的 `INSERT` 将计算要插入的元组（包括执行任何必需的 `nextval` 调用），然后再检测到任何可能导致其遵循 `ON CONFLICT` 规则的冲突。因此，Aurora DSQL 的序列对象*不能用于获取“无间隙”序列*。  
同样，由 `setval` 所做的序列状态更改会立即对其它事务可见，并且在发出调用的事务回滚时不会撤消。

序列函数要执行操作的序列由 `regclass` 参数指定，该参数只是序列在 `pg_class` 系统目录中的 OID。但是，您不必手动查找 OID，因为 `regclass` 数据类型的输入转换器将为您完成此项工作。有关详细信息，请参阅有关 [Object Identifier Types](https://www.postgresql.org/docs/current/datatype-oid.html) 的 PostgreSQL 文档。