您的位置:寻梦网首页编程乐园数据库PostgreSQL 7.2 Documentation

4.11. 序列操作函数

Table 4-24. 序列函数

函数 返回 描述
nextval ( text ) bigint 递增序列并返回新值
currval ( text ) bigint 返回最近一次用 nextval 获取的数值
setval ( text , bigint ) bigint 设置序列的当前数值
setval ( text , bigint , boolean ) bigint 设置序列的当前数值以及 is_called 标志

本节描述 PostgreSQL 用于操作 序列对象 的函数.序列对象(也叫序列生成器或者就是序列) 都是用 CREATE SEQUENCE 创建的特殊的单行表. 一个序列对象通常用于为行或者表生成唯一的标识符. 序列函数为我们从序列对象中获取后续的序列值提供了简单的,多用户安全的 方法.

由于历史原因,序列函数调用可以操作的序列是通过一个文本字串参数声明的. 为了可以和处理普通 SQL 名字具有一定兼容性,序列函数把它们的参数 转换成小写,除非用户用双引号把它们括起来.因此

nextval('foo')      
operates on sequence 

foo

nextval('FOO')      
operates on sequence 

foo

nextval('"Foo"')    
operates on sequence 

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);           
下次 nextval() 将返回 43

SELECT setval('foo', 42, true);     
和上面一样

SELECT setval('foo', 42, false);    
下次 nextval() 将返回 42

setval 返回的结果就是它的第二个参数的数值.

Important: 为了避免从同一个序列获取数值的当前事务被阻塞, nextval 操作决不会回滚;也就是说,一旦一个数值已经 被抓走,那么就认为它已经用过了,即使调用 nextval 的事务后面又退出了也一样.这就意味着退出的事务可能在序列赋予的数值 中留下 "空洞" setval 操作也决不回滚.

如果一个序列对象是带着缺省参数创建的,那么对它调用 nextval() 将返回从一开始的后续的数值. 其它的行为可以通过使用 CREATE SEQUENCE 命令里的 特殊参数获取;参阅其命令参考页获取更多信息.