引出: 在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