mybatis+postgresql返回递增主键的正确姿势及勘误

来源:互联网 发布:excel设置数据标签 编辑:程序博客网 时间:2024/05/16 05:04

前言

某日需要更换成为postgresql,于是,mybatis返回递增主键便是一个问题。

网上做法

这里写图片描述

        <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">            SELECT nextval('serial_project_id')        </selectKey>```

这段代码便是返回递增主键的值了,
那么我们看看实际插入记录以后的主键发布:

这里写图片描述

于是看到了生成的主键竟然不连续,问题到底出在哪里了?
让我们看看nextval这些函数的意义:

nextval('sequence_name'): 将当前值设置成递增后的值,并返回currval('sequence_name'): 返回当前值setval('sequence_name', n, b=true): 设置当前值;b 默认设置 true,下一次调用 nextval() 时,直接返回 n,如果设置 false,则返回 n+increment:

很明显我们调用nextval的时候已经改变了值,然后插入时候又会改一次。

解决方案

很简单:

        <selectKey keyProperty="id" resultType="java.lang.Long" order="BEFORE">            SELECT nextval('serial_project_id')        </selectKey>

改成:

        <selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">            SELECT currval('serial_project_id')        </selectKey>