GBase 8s
其他
问答

使用druid连接池连接gbase,插入语句执行后拿到错误的自增id

发表于2025-08-04 00:07:56230次浏览9个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:GBase8sV8.8.5

【操作系统】:centos 7

【CPU】:

【问题描述】*: java应用中使用druid连接池连接gbase,使用mybatis执行插入后语句后通过select last_insert_id获取自增id列,但时候有时会出现拿到的自增id错误的情况,是什么原因?

评论

登录后才可以发表评论
用户头像
路路路发表于 1年前
稍等
用户头像
GBase用户137发表于 1年前
有详细的报错信息吗,方便贴下报错截图或日志吗
GBase用户20392发表于 1年前
@GBase用户137:没有报错,就是在插入主表数据后通过select last_insert_id()获取主表的自增id,返回了错误的id
用户头像
GBase用户137发表于 1年前
@GBase用户20392:发下执行的DDL语句吧,以及是在什么库下操作的
用户头像
GBase用户137发表于 1年前
@GBase用户20392:这应该是兼容模式的问题。原因分析可参考这个链接https://blog.csdn.net/u014087707/article/details/124605664。
解决方法:
方法1、使用命令获取序列ID:
SELECT last_value FROM 序列名;
方法2、默认兼容模式下,将自增id改成序列类型。
方法3、这些操作在B兼容模式下进行,创建B兼容模式库:
CREATE DATABASE dbname DBCOMPATIBILITY='B';
切换至B兼容库:
\c dbname
GBase用户20392发表于 1年前
@GBase用户137:ddl:CREATE TABLE calculation_task (
"id" int4 NOT NULL DEFAULT AUTO_INCREMENT,
"source_type" int4,
CONSTRAINT "calculation_task_primary83" PRIMARY KEY ("id")
)意思是id只能改成序列,不能用AUTO_INCREMENT吗
用户头像
GBase用户137发表于 1年前
@GBase用户20392:是的
GBase用户20392发表于 1年前
@GBase用户137:改成序列的话对我们的业务影响太大了,如果要保留自增id有没有什么方式?
用户头像
GBase用户137发表于 11个月前
@GBase用户20392:可以参考上述第三种方法,创建一个B兼容模式的库,这种模式下应该是支持自增列的