1. 程式人生 > >mybatis+postgresql返回遞增主鍵的正確姿勢及勘誤

mybatis+postgresql返回遞增主鍵的正確姿勢及勘誤

前言

某日需要更換成為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>