数据表某个字段的数据有断层 现在连续生成的问题?

原创
2016-06-23 13:46:10632浏览

有一个数据表 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,??就可以避免???突了。因?用主?做唯一。

谢谢你的热心回答,对我很有启发,但是现在的数据表有些混乱,按照id号已办不到,因为当初这些数据是手动填写的,各种数据都可能存在,最大的会员号是03109999999

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 的算法(毕竟那样数据库运算量要小得多)

谢谢大家的热心解答 有点明白了 基础不大好 还得慢慢琢磨

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
PHP中文网
程序员·梦开始的地方
下载APP