序列操作函数
序列操作函数¶
本节描述用于操作序列对象的函数,序列对象也被称为序列生成器或者就是序列。序列对象都是用"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
可以设置为true
或false
。true
具有和双参数形式相同的效果。如果你把它设置为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) ```