pgsql中序列函数 nextval(regclass)、currval(regclass)、lastval()、setval(regclass, bigint)、setval(regclass

情景重现:
新建了一个数据库表,
weibo=# create table a(id serial primary key ,name text default ''::text);
CREATE TABLE
weibo=#
weibo=# \d+ a;
                                             Table "public.a"
 Column |  Type   |                   Modifiers                    | Storage  | Stats target | Description
--------+---------+------------------------------------------------+----------+--------------+-------------
 id     | integer | not null default nextval('a_id_seq'::regclass) | plain    |              |
 name   | text    | default ''::text                               | extended |              |
Indexes:
    "a_pkey" PRIMARY KEY, btree (id)

往表a插入两条数据

weibo=# insert into a(name) values('cqs'),('mz');
INSERT 0 2

查一下表数据
weibo=# select * from a;
 id | name
----+------
  1 | cqs
  2 | mz
(2 rows)

接着清空表中所有数据
weibo=# truncate table a;
TRUNCATE TABLE
weibo=# select * from a;
 id | name
----+------
(0 rows)

再插入两条数据
weibo=# insert into a(name) values('cqs'),('mz');
INSERT 0 2
weibo=# select * from a;                         
 id | name
----+------
  3 | cqs
  4 | mz
(2 rows)

这时候问题来了,为啥id不是从1开始呢,有没有方法让它重新排序
这时候就要用到pg中的序列

查看目前的序列是
weibo=# select currval('a_id_seq');
 currval
---------
       4
(1 row)
下一个序列式
weibo=# select nextval('a_id_seq');
 nextval
---------
       5
(1 row)

这时候我们可以使用序列函数进行配置
weibo=# select setval('a_id_seq',1);
 setval
--------
      1
(1 row)

weibo=# insert into a(name) values('haha');
INSERT 0 1
weibo=# select * from a;
 id | name
----+------
  3 | cqs
  4 | mz
  2 | haha
(3 rows)
发现haha的id值是2了,如果想让id也产生1,那个使用
weibo=# select setval('a_id_seq',1,false);
 setval
--------
      1
(1 row)

weibo=# insert into a(name) values('gaga');
INSERT 0 1
weibo=# select * from a;                   
 id | name
----+------
  3 | cqs
  4 | mz
  2 | haha
  1 | gaga
(4 rows)
weibo=# insert into a(name) values('gaga');
ERROR:  duplicate key value violates unique constraint "a_pkey"
DETAIL:  Key (id)=(2) already exists.

我们现在查找最大的序列值,配置后重新插入就行了,目前最大的是4
weibo=# select setval('a_id_seq',4);       
weibo=# select setval('a_id_seq',5,false);--与上面语句等价        
 setval
--------
      4
(1 row)

weibo=#
weibo=#
weibo=#
weibo=# insert into a(name) values('lala');
INSERT 0 1
weibo=# select * from a;                   
 id | name
----+------
  3 | cqs
  4 | mz
  2 | haha
  1 | gaga
  5 | lala
(5 rows)

接下来排序就往后执行了。
weibo=# insert into a(name) values('zaza');
INSERT 0 1
weibo=# select * from a;                   
 id | name
----+------
  3 | cqs
  4 | mz
  2 | haha
  1 | gaga
  5 | lala
  6 | zaza
(6 rows)

主要涉及到的函数是 
函数 返回类型 描述
nextval(regclass) bigint 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。
currval(regclass) bigint 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。
lastval() bigint 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。
setval(regclass, bigint) bigint 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。
setval(regclass, bigint, boolean) bigint 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为truefalse。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。

你可能感兴趣的:(postgresql)