选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.15. 序列操作函数 #

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

表 9.40. 序列函数

Function Return Type 描述
currval(regclass) bigint 返回最近对指定序列调用 nextval 得到的值
lastval() bigint 返回最近对任意序列调用 nextval 得到的值
nextval(regclass) bigint 推进序列并返回新值
setval(regclass, bigint) bigint 设置序列的当前值
setval(regclass, bigint, boolean) bigint Set sequence's current value and is_called flag

序列函数要操作的序列由一个regclass参数指定,该参数就是序列在pg_class系统目录中的 OID。不过,不必手动查找 OID,因为regclass数据类型的输入转换函数会替你完成这项工作。只需将序列名用单引号括起来,使其看上去像一个字面常量。为兼容普通SQL名称的处理方式,除非序列名被双引号括起,否则字符串会转换为小写。因此:

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

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

nextval('myschema.foo')     操作 myschema.foo
nextval('"myschema".foo')   同上
nextval('foo')              在搜索路径中查找 foo

参见第 8.16 节以获取更多有关以下类型的信息:regclass

注意

PostgreSQL 8.1 之前,序列函数的参数类型是text,而不是regclass;上述从文本字符串到 OID 值的转换会在每次调用时于运行期间执行。为保持向后兼容,这种能力仍然存在,但内部现在会在调用函数前,通过从textregclass的隐式强制转换来处理。

将序列函数的参数写成不加修饰的字符串字面量时,它会成为以下类型的常量:regclass。由于它实际上只是一个 OID,即使后来发生重命名、模式变更等情况,它仍会指向最初标识的序列。这种早绑定行为通常适用于列默认值和视图中的序列引用。但有时你可能希望采用后绑定,在运行时解析序列引用。要获得后绑定行为,应强制将常量存储为text常量,而不是regclass

nextval('foo'::text)      foo运行时被查找

请注意,后绑定是下列旧版本唯一支持的行为:PostgreSQL8.1 之前的版本,因此可能需要这样做来保留旧应用的语义。

当然,序列函数的参数既可以是常量,也可以是表达式。如果它是文本表达式,隐式强制转换就会导致运行时查找。

可用的序列函数有:

nextval

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

currval

返回当前会话中nextval最近一次为该序列获取的值。(如果在本会话中从未对该序列调用过nextval,则会报告错误。)由于返回的是一个会话局部的值,无论其他会话在当前会话之后是否执行过nextval,它都给出可预测的答案。

lastval

返回当前会话中nextval最近一次返回的值。该函数与currval相同,只是它不以序列名为参数,而是获取当前会话中nextval最近使用的序列的值。如果当前会话尚未调用过nextval,调用lastval是错误的。

setval

重置序列对象的计数值。双参数形式把序列的last_value字段设置为指定值,并把其is_called字段设置为true,这意味着下一次nextval将在返回值之前推进序列。currval报告的值也被设置为指定值。在三参数形式中,is_called可以设置为truefalsetrue与双参数形式效果相同。如果设置为false,下一次nextval将恰好返回指定的值,序列的推进从再下一次nextval开始。此外,在这种情况下currval报告的值不会改变(这与 8.3 之前的行为不同)。例如,

SELECT setval('foo', 42);           Next nextval will return 43
SELECT setval('foo', 42, true);     Same as above
SELECT setval('foo', 42, false);    Next nextval will return 42

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

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

重要

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。