本节描述 PostgreSQL 用于操作 序列对象的函数。序列对象(也叫序列生成器或者就是序列) 都是用 CREATE SEQUENCE 创建的特殊的单行表。 一个序列对象通常用于为行或者表生成唯一的标识符。 序列函数,在 Table 9-34 列出, 为我们从序列对象中获取后续的序列值提供了简单的,多用户安全的 方法。
Table 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 抓到的该序列的 数值。(如果在本会话中从未在该序列上调用过 nextval, 那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值, 因此即使其它会话同时在执行 nextval,那么它也能 给出一个可预计的结果。
重置序列对象的计数器数值。双参数的形式设置序列的 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 返回的结果就是它的第二个参数的数值。
Important: 为了避免从同一个序列获取数值的当前事务被阻塞, nextval 操作决不会回滚;也就是说,一旦一个数值已经 被抓走,那么就认为它已经用过了,即使调用 nextval 的事务后面又退出了也一样。这就意味着退出的事务可能在序列赋予的数值 中留下"空洞"。setval 操作也决不回滚。
如果一个序列对象是带着缺省参数创建的,那么对它调用 nextval 将返回从1 开始的后续的数值。 其它的行为可以通过使用 CREATE SEQUENCE 命令里的 特殊参数获取;参阅其命令参考页获取更多信息。