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时会报重复记录错误。

猜你喜欢

转载自blog.csdn.net/chuangxin/article/details/85112608
今日推荐