数据表某个字段的数据有断层 现在连续生成的问题?
有一个数据表 mem 里有字段 id sn (会员号) 原来会员号是手动填写的比如说 有数据 03117777777 ,03100005555,03100005556 sn是11位 但是数据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 的算法(毕竟那样数据库运算量要小得多)
0
0
相关文章
ini_set()在PHP中的作用是什么?
在PHP中的readlink()函数
我们如何编写PHP脚本来释放与MySQL结果关联的游标内存?
PHP intdiv() 函数
我们如何使用PHP脚本删除MySQL数据库?
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
Java Spring Boot 微服务实战
本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。
1
2025.12.24
热门下载
网站特效
/
网站源码
/
网站素材
/
前端模板
相关下载
精品课程
相关推荐
/
热门推荐
/
最新课程
黑马云课堂jQuery基础视频教程
共46课时 | 9.9万人学习
最新文章








