pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述PostgreSQL中用于操作序列对象(也称为序列生成器,或简称序列)的函数。 序列对象是用CREATE SEQUENCE创建的特殊单行表。 序列对象通常用于为表中的行生成惟一标识符。在表 9.34中列出的序列函数,提供了简单的、多用户安全方法,用于从序列对象中获取连续的序列值。
表 9.34. 序列函数
| Function | Return Type | 描述 |
|---|---|---|
|
bigint |
推进序列并返回新值 |
|
bigint |
返回最近用 nextval 获取的值 |
|
bigint |
设置序列的当前值 |
|
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); 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操作永远不会被回滚;也就是说,一旦取出了一个值,它就被视为已使用,即使执行nextval的事务随后中止也是如此。这意味着中止的事务可能会在已分配的值序列中留下未使用的“空洞”。setval操作也永远不会被回滚。
如果一个序列对象是用默认参数创建的,那么连续调用nextval将返回从 1 开始的连续值。通过在CREATE SEQUENCE命令中使用特殊参数,可以得到其他行为;更多信息见其命令参考页。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。