↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

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 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2
历史版本PostgreSQL 8.2 已于 2011 年 12 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

9.12. 序列操作函数 #

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

表 9.34. 序列函数

Function Return Type 描述
currval(regclass) bigint 返回最近对指定序列调用 nextval 得到的值
nextval(regclass) bigint 推进序列并返回新值
setval(regclass, bigint) bigint 设置序列的当前值
setval(regclass, bigint, boolean) bigint 设置序列的当前值和is_called标志

序列函数要操作的序列由一个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.12 节以获取更多有关以下类型的信息:regclass。

注意

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

将序列函数的参数写成不加修饰的字符串字面量时,它会成为以下类型的常量: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将在返回值之前推进序列。在三参数形式中,is_called可以设置为true或false。如果设置为false,下一次nextval将恰好返回指定的值,序列的推进从再下一次nextval开始。例如,

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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。