posgresql如何获取自增id的当前值或者下一个值?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cdnight/article/details/88169733

前言

获取这个在某些地方是有用的,
譬如,创建机器人时候,获取一个id,然后其他地方根据这个id来填写。
下面请先参考以下文章:
也谈如何获得PostgreSQL序列的当前值(最后值)

    由于前段时间一台Linux服务器(在VM笼子里),莫名其妙被一台AD撑破空间弄死了,再也救不会来(可见VM也不安全),可幸的是刚给这台Linux做了一台在线备用服务器,于是赶紧切换IP,把复制支点抹掉等等,然后用备用服务器设置Live。

     本以为一切没问题,但后来用户某些系统部分功能报错,一查才发现备用服务器上PostgreSQL的序列没有被同步过来(我现在用的是slony做的同步),然后各自手动设置一番就不说了。

    后来细想,有必要把这些序列的最新值也同步过来,slony没有此功能唯有自己写shellscript实现,但如何获得Live服务器上序列的最新值呢?度娘了一番,无非都是用currval('seq_name')这样的函数获得,但是,新开一个session用currval会报错的,当前大家提供的折中办法是先用nextval再用currval,不甘心,再谷歌一番也是这样的说法。

    于是拿起计算机敲了一下,如果我要1分钟同步一次,一天要损失1.4K 个序列,一年要损失525K个序列,这是非常不可取的!

    但通过各种尝试,居然找个一个办法轻松获得,各位看官请看:

    假如我要知道seq_mail_id这个序列的最后值,那么只需要:

    select * from seq_mail_id ;

    结果表中last_value这个值就是你想要的,easy吧?
--------------------- 
作者:OK_boom 
来源:CSDN 
原文:https://blog.csdn.net/rocklee/article/details/24366373 
版权声明:本文为博主原创文章,转载请附上博文链接!

好了,给个真实例子
假设一张user表,里面主键自增,为userId,那么,

mybatis中取自增列的值

第一,在mybatis里面获取当前的主键id的方法是:
在这里插入图片描述

其中,

 select currval(pg_get_serial_sequence('user', 'userId'))
 等价于:
 SELECT currval('user_userId_seq')

那为什么用pg_get_serial_sequence呢?因为sequence的名称是可以人为改变的。。。
默认生成的是{表名}_{自增列名}_seq,不过人工添加的什么也可能的。

不在数据库session中获取自增列的值

假如不在一个查询中要单独看自增列的值,用:

select * from 自增seq名称。

譬如:
执行:

select * from "user_userId_seq";

有:
在这里插入图片描述

last_value就是需要的值了。

猜你喜欢

转载自blog.csdn.net/cdnight/article/details/88169733
今日推荐