Postgresql-数据库复制表id自增失效解决办法

当在Navicat中将MySQL的表复制到PostgreSQL后,可能会遇到ID自增功能失效的问题。解决方法包括:创建序列,设置表的ID字段默认取值为序列的nextval函数,并在插入数据后查询当前序列值作为新ID。在MyBatis中使用此方法时要注意,如果插入数据同时获取ID,可能因执行两条SQL导致返回值为-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引出: 在navicat中从mysql数据库复制表到pgsql数据库,发现pgsql中的id自增失效,添加数据不会自增;

解决办法:

一、为表创建一个序列

CREATE SEQUENCE public.tablename_id_seq
INCREMENT 1   // 每次自增数
MINVALUE 1    // 最小值
MAXVALUE 9223372036854775807  // 最大值
START 37      // 起始值(通常复制表已经有数据,id起始值通常!=1)
CACHE 1;      // 缓存数

二、给 id 字段加上默认取值函数
在这里插入图片描述

示例:nextval(‘public.tablename_id_seq’::regclass)
解释:nextval(‘模式名.序列名’::regclass)

三、测试
navicat手动添加一条数据,观察id是否自增即可

四、插入数据返回id

以子查询的方式查询当前表对应的序列当前值,并赋值给指定接收参数的某个变量
其中 :
parameterType=“com.xxx.entity.User” // 指定返回id的接收对象
keyProperty=“id” // 指id接收对象中接收id值的那个变量的名称
resultType=“java.lang.Long” // 指返回id的类型
order=“AFTER” // 指在插入数据之后做id查询

 <insert id="insert" parameterType="com.xxx.entity.User">
	<selectKey resultType="java.lang.Long" keyProperty="id" order="AFTER">
		select currval('aaa_jdbc.table_names_id_seq'::regclass) AS id
	</selectKey>
	insert into aaa_jdbc.table_names () VALUES ()
 </insert>

注意
在结合mybatis使用pgsql数据库时,如果插入数据同时执行的了查询id,一共就执行了两条sql语句!而mybatis执行两条以上sql语句成功返回值为-1,而不是1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值