©
本文檔使用 php中文網手册 發布
本节描述PostgreSQL用于操作序列对象的函数。序列对象(也叫序列生成器或者就叫序列) 都是用 CREATE SEQUENCECREATE SEQUENCE创建的特殊的单行表。 一个序列对象通常用于为行或者表生成唯一的标识符。在Table 9-39中列出的序列函数为我们 从序列对象中获取后续的序列值提供了简单的、多用户安全的方法。
Table 9-39. 序列函数
函数 | 返回类型 | 描述 |
---|---|---|
currval(regclass) |
bigint | 返回最近一次用nextval 获取的指定序列的数值 |
lastval() |
bigint | 返回最近一次用nextval 获取任何序列的数值 |
nextval(regclass) |
bigint | 递增序列并返回新值 |
setval(regclass,bigint) |
bigint | S设置序列的当前数值 |
setval(regclass,bigint,boolean) |
bigint | 设置序列的当前数值以及is_called标志 |
用regclass参数指定序列函数操作的序列,它只是序列在 系统表空间的pg_class表里的 OID 。不过,你不需要手工查找 OID ,因为 regclass数据类型的输入转换器会帮你做这件事。只要写出单引号包围的序列名字 即可,因此它看上去像文本常量。要达到和处理普通SQL名字的兼容性, 这个字符串将转换成小写,除非在序列名字周围包含双引号,因此:
nextval('foo') operates on sequencefoo nextval('FOO') operates on sequencefoo nextval('"Foo"') operates on sequenceFoo
必要时序列名可以用模式修饰:
nextval('myschema.foo')operates on 操作myschema.foo nextval('"myschema".foo')same as above同上 nextval('foo') searches search path for 在搜索路径中查foo
见Section 8.16获取有关regclass的更多信息。
Note: 在PostgreSQL8.1之前,序列函数的参数类型是text而不是regclass, 而上面描述的从文本字符串到 OID 值的转换将在每次调用的时候发生。 为了向下兼容,这个机制仍然存在, 但是在内部实际上是在函数调用前隐含地将text转换成regclass实现的
如果你把一个序列函数的参数写成一个无修饰的文本字符串,那么它将变成类型 为regclass的常量。因为这只是一个 OID ,它将跟踪最初标识的序列, 而不管后面是否改名、模式是否变化等等。这种"提前绑定"的行为通常是字段缺省 和视图里面引用序列所需要的。但是有时候你可能想要"推迟绑定",这个时候序列的引用是在运行时解析的。 要获取推迟绑定的行为,我们可以强制存储为text常量,而不是regclass常量:
nextval('foo'::text) foois looked up at runtime在运行时查找请注意,推迟绑定是PostgreSQL版本 8.1 之前唯一可用的行为, 因此你可能需要在旧的应用程序里如此使用来保留旧有的语义。
当然,序列函数的参数也可以是表达式。如果它是一个文本表达式, 那么隐含的转换将导致运行时的查找。
可用的序列函数有:
nextval
递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的:
即使多个会话并发运行nextval
,
每个进程也会安全地收到一个唯一的序列值。
currval
在当前会话中获取最近一次nextval
序列的数值。(如果在本会话中从未在
该序列上调用过nextval
,那么会报告一个错误。)请注意,因为此函数返回一个本会话范围的数值,
它也能给出一个可预计的结果,可以判断其它会话是否执行过nextval
函数
lastval
返回当前会话里最近一次nextval
返回的数值。这个函数等效于currval
,
只是它不用序列名作为参数,它获取当前会话里面最近一次nextval
使用的序列。
如果当前会话还没有调用过nextval
,那么调用lastval
是会报错的。
setval
重置序列对象的计数器数值。2个参数的形式设置序列的last_value字段
为声明数值并且将其is_called字段设置为true,
表示下一次nextval
将在返回数值之前递增该序列。currval
报告的值也设定为指定的值。
在3个参数形式里,is_called可以设置为
true或false。如果你把它设置为false,
那么下一次nextval
将返回这里声明的数值而随后nextval
才开始递增该序列。
因此在这种情况下currval
报告的值没有改变(这是8.3之前版本的一个变化) 比如,
SELECT setval('foo', 42);nextval
的下一个将返回43 SELECT setval('foo', 42, true);如上所述 SELECT setval('foo', 42, false);nextval
的下一个将返回42
setval
返回的结果就是它的第二个参数的数值。
如果一个序列对象是带着默认参数创建的,那么对它调用nextval
将返回从1开始的后续数值。其它的行为可以通过使
用CREATE SEQUENCE的指定参数选项获取;参阅其命令参考页获取更多信息。
Important: 为了避免从同一个序列获取数值的当前事务被阻塞,
nextval
操作决不会回滚; 也就是说,一旦一个数值已经被抓走,那么就认为它已经用过了, 即使调用nextval
的事务后面又退出了也一样。 这就意味着退出的事务可能在序列赋予的数值中留下"空洞"。setval
操作也决不回滚