解决postgresql序列的跳转值问题
  • 作者:admin
  • 发表时间:2021-04-29 07:52
  • 来源:未知

本文主要介绍如何解决postgresql序列的跳转值问题,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看。

一、序列的创建

CREATE SEQUENCE seq_bm_menuid

增量1

MINVALUE 1

MAXVALUE 99999999999999999999

第一阶段

CACHE 5;

从上面的语句可以看出,当前序列的缓存是5,那么这个缓存什么时候工作呢?

二、遇到的顺序跳转问题

当我们的web应用程序访问postgresql数据库,使用nextval('seq_bm_menuid ')获取序列值,然后插入到我们的业务表中时,发现业务表中序列值对应的字段的值是不连续的,每隔5跳一次。

如图所示:

第三,做一个小实验

为了找出序列跳转值的原因,做了如下的小实验:在pgAdmin中创建新的两个查询窗口,分别执行select next val(' seq _ BM _ menuid ');语句,在第一个查询窗口执行该语句时,返回序列值为147;在第二个查询窗口执行该语句时,返回序列值为152;果然还是间隔5的序列值。继续走,你就会知道发生了什么。

我们回到第一个查询窗口,再次执行该语句。此时,返回序列值为148;转到第二个查询窗口,再次执行该语句。此时,返回序列值为153;最后,我们知道序列的缓存作用于会话。我们创建了两个新的查询窗口,实际上是两个会话。postgresql数据库为每个会话缓存五个序列值。最后,找出序列跳跃值的原因。

补充:重置PostGresql序列起始值

修改和设置Postgresql序列值的情况很少,但通常在数据库使用不当的情况下是存在的!

有时候数据库的顺序出了问题之后,detail : key(xttblog _ id)=(200007)的错误消息已经存在。在这种情况下,序列200007已经被占用。

有两种方法可以纠正这个错误

一种是执行nextval函数并跳过现有的键。

1SELECT nextval('唐山网站排名xttblog _ id _ seq ');

在另一种情况下,重置序列的起始值并跳过现有的键。

-序列重置为2020更改序列xtt blog _ id _ seq从2020重新开始

我把序列重置为上面的2020。然后序列从2020年开始,小于2020的跳过。