前言
某日需要更换成为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>