4.11. 序列操作函数 #
表 4.24. 序列函数
| 函数 | 返回类型 | 描述 |
|---|---|---|
nextval(text) | bigint | 推进序列并返回新值 |
currval(text) | bigint | 返回最近一次用nextval获取的值 |
setval(text,bigint) | bigint | 设置序列的当前值 |
setval(text,bigint,boolean) | bigint | 设置序列的当前值和 is_called 标志 |
本节描述 PostgreSQL 中用于操作序列对象的函数。序列对象(也称为序列生成器或简称序列)是用
CREATE SEQUENCE 创建的特殊单行表。序列对象通常用于为表中的行生成唯一标识符。本节中描述的序列函数都对一个 regclass 参数操作,它是序列的 OID。
主要是由于历史原因,序列函数调用所要操作的序列是通过一个文本字符串参数指定的。为了与普通 SQL 名称的处理方式保持一定的兼容性,除非字符串用双引号括起,否则序列函数会把参数转换为小写。因此
nextval('foo') 操作序列 foo
nextval('FOO') 操作序列 foo
nextval('"Foo"') 操作序列 Foo当然,文本参数也可以是表达式的结果,不仅仅可以是简单的文字常量,这偶尔会很有用。
可用的序列函数有:
nextval把序列对象推进到它的下一个值并返回该值。这是以原子方式完成的:即使多个会话并发执行
nextval,每个会话也会安全地得到一个不同的序列值。currval返回当前服务器进程中此序列最近一次由
nextval获取的值。(如果本进程中从未对这个序列调用过nextval,则会报告一个错误。)注意,由于返回的是进程局部的值,即使其他服务器进程同时在执行nextval,它也能给出可预测的答案。setval重置序列对象的计数器值。双参数形式把序列的
last_value字段设置为指定的值,并把其is_called字段设置为true,这意味着下一次nextval将先推进序列再返回一个值。在三参数形式中,is_called可以设置为true或false。如果把它设置为false,那么下一次nextval将准确返回指定的值,序列的推进从再下一次nextval开始。setval返回的结果只是其第二个参数的值。
重要
为了避免阻塞从同一序列获取编号的并发事务,nextval操作永远不会被回滚;也就是说,一旦取出了一个值,它就被视为已使用,即使执行nextval的事务随后中止也是如此。这意味着中止的事务可能会在已分配的值序列中留下未使用的“空洞”。setval操作也永远不会被回滚。
如果序列对象是用默认参数创建的,对它的 nextval() 调用将返回从 1 开始的连续值。其他行为可以通过在 CREATE SEQUENCE 命令中使用特殊参数来获得;更多信息见它的命令参考页。