定长下自增ID的获取方式
正常情况下,在开发菜单树的时候都会使用010 001 001 这样 三位代表一层的方式来表示该菜单的menuCode,
节点最大值为:999,一个节点下的子节点也不可能达到999,试想一下,如果节点下子节点太多,操作起来都不方便,
在新增的时候,会查询出最大的一位在加1,然后用加1 之后的值和最大值 999做比较,
如果小于999,怎么没问题,可以做id,大于在前台提示,不能在新增了,
这样看起来在逻辑上和实现上都没问题,
但是,这样看起来没问题的代码,存在一个很大的问题,
1、在生产上所有的数据不可能都是有代码生成的,也有是人为处理的数据,这样导致id不能像代码写那样查询出最大值再加1,(逻辑上递增),
2、可能是生产问题,在人为修复数据之后,可能会造成,递增跳跃的问题,例如566 567,590,
以上这两种情况都可能造成,在前台页面新增的数据没达到999条,但是在新增的时候查询出的max(code)已经是998了,这样就不能充分的使用到全部>999数字了,
逻辑优化:
弃用max(code),改用比较查询的方式,
思路:在查询的时候,查询出code的值,存放到list(map)中,得到list的总数total,
假如:total == 999 此时直接返回提示信息,
total < 999
遍历list,得到map,在从map中得到code。
将code。存放到新创建的alist中,
在定义一个for循环,最大值为999,和存放code的alist做包含判断,假如不包含,可以将不包含的的值存放到另一个新创建的blist中,
当for循环执行结束之后,blist中就存放的时,数据库code在999之间没有使用的数字,
此时,你可以随机从blist中取出一个值用作新的id,取第一个也没问题,
让后组装数据id,插入的数据库表,下次新增的时候,当程序跑完for循环之后,blist会少一个上一次取到的值,
实现代码如下:
这种效果能比使用max(code)在加1更能充分的使用0~999之间的数值,