↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.

9.11. 序列操作函数 #

本节描述PostgreSQL中用于操作序列对象(也称为序列生成器,或简称序列)的函数。序列对象是用CREATE SEQUENCE创建的特殊单行表。序列对象通常用于为表中的行生成惟一标识符。在表 9.34中列出的序列函数,提供了简单的、多用户安全方法,用于从序列对象中获取连续的序列值。

表 9.34. 序列函数

函数返回类型描述
nextval(text)bigint推进序列并返回新值
currval(text)bigint返回最近一次用nextval获取的值
setval(text, bigint)bigint设置序列的当前值
setval(text, bigint, boolean)bigint设置序列的当前值和 is_called 标志

主要是由于历史原因,序列函数调用所要操作的序列是通过一个文本字符串参数指定的。为了与普通 SQL 名称的处理方式保持一定的兼容性,除非字符串用双引号括起,否则序列函数会把参数转换为小写。因此

nextval('foo')      操作序列 foo
nextval('FOO')      操作序列 foo
nextval('"Foo"')    操作序列 Foo

必要时序列名称可以带模式限定:

nextval('myschema.foo')     操作 myschema.foo
nextval('"myschema".foo')   与上面相同
nextval('foo')              在搜索路径中搜索 foo

当然,文本参数也可以是表达式的结果,不仅仅可以是简单的文字常量,这偶尔会很有用。

可用的序列函数有:

nextval

把序列对象推进到它的下一个值并返回该值。这是以原子方式完成的:即使多个会话并发执行 nextval,每个会话也会安全地得到一个不同的序列值。

currval

返回当前会话中此序列最近一次由 nextval 获取的值。(如果本会话中从未对这个序列调用过 nextval,则会报告一个错误。)注意,由于返回的是会话局部的值,即使其他会话同时在执行 nextval,它也能给出可预测的答案。

setval

重置序列对象的计数器值。双参数形式把序列的 last_value 字段设置为指定的值,并把其 is_called 字段设置为 true,这意味着下一次 nextval 将先推进序列再返回一个值。在三参数形式中,is_called 可以设置为 true 或 false。如果把它设置为 false,那么下一次 nextval 将准确返回指定的值,序列的推进从再下一次 nextval 开始。例如,

SELECT setval('foo', 42);           下一次 nextval 将返回 43
SELECT setval('foo', 42, true);     与上面相同
SELECT setval('foo', 42, false);    下一次 nextval 将返回 42

setval 返回的结果只是其第二个参数的值。

重要

为了避免阻塞从同一序列获取编号的并发事务,nextval操作永远不会被回滚;也就是说,一旦取出了一个值,它就被视为已使用,即使执行nextval的事务随后中止也是如此。这意味着中止的事务可能会在已分配的值序列中留下未使用的“空洞”。setval操作也永远不会被回滚。

如果一个序列对象是用默认参数创建的,那么连续调用nextval将返回从 1 开始的连续值。通过在CREATE SEQUENCE命令中使用特殊参数,可以得到其他行为;更多信息见其命令参考页。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.