1. 程式人生 > >Mysql資料庫 AUTO_INCREMENT 自增序列號 跳號處理

Mysql資料庫 AUTO_INCREMENT 自增序列號 跳號處理

Mysql資料庫產生序列號通常使用big int型別,並設定AUTO_INCREMENT為true,這樣每次insert記錄的時候,序列號會自動遞增。
這樣操作基本上沒什麼問題,有個專案甲方提出sid儘量不能跳號,上述處理方式就有問題了,比如:銷售訂單建立:
1)先生成主表記錄,後生成細表記錄
2)在細表記錄資料有效性驗證時(產品庫存及7天內生產計劃安排驗證,及累積未發訂單量<=庫存量+7天內生產計劃安排量,驗證失敗)
3)細表不insert記錄,主表事務回滾,sid已經遞增不再回滾。
於是下個訂單再建立時,序列號sid就出現跳號情況。

解決方案:基於專案緊,資料量不是很大,於是選用了一個最簡單的方案。

select min(a.sid) + 1 from sale_so_bill a
where not exists(select b.sid from sale_so_bill b where b.sid - 1 = a.sid)

1)先通過上面sql能否找到最小的跳號值;
2)能找到則insert 主表sale_so_bill時,指定sid值

該跳號處理方案還有2格注意事項:
1)這樣一來訂單排序就需要注意了,不能使用sid表示訂單先後順序。
2)獲取跳號值有可能併發問題,多人取到同一個值,insert時會報重複記錄錯誤。