Home >Backend Development >PHP Tutorial >数据表某个字段的数据有断层 现在连续生成的问题?
有一个数据表 mem 里有字段 id sn (会员号) 原来会员号是手动填写的比如说 有数据 03117777777 ,03100005555,03100005556 sn是11位 但是数据sn 有的连续 有的不连续,有可能先填写是最大的号 ,后填写的最小的号 现在更改需求以后 不能动原来的数据 想要连续生成不能重复, 每注册一个会员生成一个会员号分给会员,怎么保证会员号不重复又能减少对比查询, 还有多个会员注册的并发问题 请教一下大家有没有好的解决办法
先找到?定一?比?在所有???都大的???。
例如?在最大的???是03100005556 那麽下一????定?03100010000,中?相差的部分放?不用了。
然後每注?一?新用?,就用03100010000+id作????。
例如新??了用?id=5678,那????就是03100015678
新???先插入??,?得id後再update sn,??就可以避免???突了。因?用主?做唯一。
先找到?定一?比?在所有???都大的???。
例如?在最大的???是03100005556 那麽下一????定?03100010000,中?相差的部分放?不用了。
然後每注?一?新用?,就用03100010000+id作????。
例如新??了用?id=5678,那????就是03100015678
新???先插入??,?得id後再update sn,??就可以避免???突了。因?用主?做唯一。
1.把你所有id取出来,得到最大的id,后期新增的数据,按照最大值后面新增。
2.用户注册并发,可以通过memcache或者redis,数据写入缓存当中。
你没有完全理解 fdipzone 的算法
他的意思是:
存在 id 和 sn 两列,id 为自增。
若 max(sn) = 03109999999
则有常量 n = max(sn) - max(id)
使得 n + (max(id)+1) = max(sn) = 03110000000
这样就从先前的混乱中走出来了,当然这就要缺失相当数量的 sn 资源
所以你也可以通过以下算法来完成补漏操作
select a.sn, b.sn as bsn from 表 a left join 表 b on a.sn+1=b.sn having bsn is null limit 1
这样就找到了一个不连续的 sn
sn + 1 就是该插入的 sn
只需在 sn 上建唯一索引,并在插入失败时重新尝试,就可解决并发问题
待表中 sn 的间歇全部充满后,再采用 dipzone 的算法(毕竟那样数据库运算量要小得多)
谢谢大家的热心解答 有点明白了 基础不大好 还得慢慢琢磨