mybatis+postgresql返回遞增主鍵的正確姿勢及勘誤
阿新 • • 發佈:2019-02-18
前言
某日需要更換成為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>