跳转至

序列操作函数

序列操作函数

本节描述用于操作序列对象的函数,序列对象也被称为序列生成器或者就是序列。序列对象都是用"CREATE SEQUENCE"创建的特殊的单行表。序列对象通常用于为表的行生成唯一的标识符。

以下序列函数,可以为从序列对象中获取连续的序列值提供了简单的、多用户安全的方法。

序列函数调用操作的序列是用一个regclass参数声明的, 它只是序列在pg_class系统表里面的OID。不需要手工查找 OID,因为regclass数据类型的输入转换器会帮你做这件事情。只要写出用单引号包围的序列名字即可,因此它看上去像文本常量。为了和普通SQL名字处理兼容,参数字串将转换成小写形式,除非在序列名字周围包含双引号。

序列函数的参数也可以是表达式。如果它是一个文本表达式,那么隐式的转换将导致运行时的查找。

以下是序列基本函数方式,必要时序列名可以用模式限定:

seaboxsql=# CREATE SEQUENCE FOO start 1;
CREATE SEQUENCE
seaboxsql=# CREATE SEQUENCE "FOO" start 100 increment 10;
CREATE SEQUENCE

-- 操作序列foo
seaboxsql=# select nextval('foo'); 
 nextval 
---------
       1
(1 row)

-- 操作序列foo
seaboxsql=# select nextval('FOO'); 
 nextval 
---------
       2
(1 row)

-- 操作序列FOO
seaboxsql=# select nextval('"FOO"'); 
 nextval 
---------
     100
(1 row)

-- 操作public.FOO
seaboxsql=# select nextval('"public"."FOO"'); 
 nextval 
---------
     110
(1 row)

表 序列函数

currval()

语法
currval(regclass)
返回类型
bigint
描述

在当前会话中返回最近一次nextval取到的该序列的值(如果在本会话中从未在该序列上调用过nextval,那么会报告一个错误)。请注意因为此函数返回一个会话本地的值,不论其它会话是否在当前会话之后执行过nextval,它都能给出。

该函数要求序列上的USAGE或者SELECT特权。

示例
``` sql seaboxsql=# select currval('foo'); currval

2 (1 row) ```

lastval()

语法
lastval()
返回类型
bigint
描述

返回当前会话里最近一次nextval返回的值。 该函数等效于currval,只是它不用序列名作为参数,它会引用当前会话里面最近一次被应用的序列的nextval。如果当前会话还没有调用过nextval,那么调用lastval会报错。

该函数要求上一次使用的序列上的USAGE或者SELECT特权。

示例
``` sql seaboxsql=# select lastval(); lastval

110 (1 row) ```

nextval()

语法
nextval(regclass)
返回类型
bigint
描述

递增序列对象到它的下一个值并且返回该值。这个动作是自动完成的:即使多个会话并发执行nextval,每个进程也会安全地收到一个唯一的序列值。

如果一个序列对象是用默认参数创建的,连续的nextval调用将会返回从 1 开始的连续的值。

该函数要求序列上的USAGE或者UPDATE特权。
注意
为了避免阻塞从同一个序列获取序号的并发事务,nextval操作从来不会被回滚。也就是说,一旦一个值被取出就视同被用掉并且不会被再次返回给调用者,即便调用该操作的外层事务后来中止或者调用查询后来没有使用取得的值也是这样。例如一个带有ON CONFLICT子句的INSERT会计算要被插入的元组,其中可能就包括调用nextval,然后才会检测到导致它转向ON CONFLICT规则的冲突。这种情况就会在已分配值的序列中留下未被使用的“空洞”。因此,SeaboxSQL的序列对象不能被用来得到“无间隙”的序列
示例
``` sql
seaboxsql=# select nextval('"public"."FOO"'); nextval

110 (1 row) ```

setval()

语法
setval(regclass,bigint,boolean)setval(regclass,bigint)
返回类型
bigint
描述

重置序列对象的计数器值。双参数的形式设置序列的last_value域为指定值并且将其is_called域设置为true,表示下一次nextval将在返回值之前递增该序列。currval报告的值也被设置为指定的值。在三参数形式里,is_called可以设置为truefalsetrue具有和双参数形式相同的效果。如果你把它设置为false,那么下一次nextval将返回指定的值,而从随后的nextval才开始递增该序列。此外,在这种情况中currval报告的值不会被改变。

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

该函数要求序列上的UPDATE特权。

注意
序列是非事务的,setval造成的改变不会由于事务的回滚而撤销。
示例

``` sql – 下一次nextval会返回 43 seaboxsql=# SELECT setval('foo', 42); setval


42 (1 row)

seaboxsql=# select nextval('foo'); nextval


  43

(1 row)

– 下一次nextval会返回 43 seaboxsql=# SELECT setval('foo', 42,true); setval


 42

(1 row)

seaboxsql=# select nextval('foo'); nextval


  43

(1 row)

– 下一次nextval会返回 42 seaboxsql=# SELECT setval('foo', 42,false); setval


 42

(1 row)

seaboxsql=# select nextval('foo'); nextval


  42

(1 row) ```