本文主要介绍如何解决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的跳过。