PHP与mysql的故事,如何让计数字段在增删后一直连续不断?

linkfan 发布于 2017/01/24 11:03
阅读 324
收藏 0

mysql数据库,一个int字段作为数据的编号,目前这个字段是根据添加数据的时间累加1的。但是有个这个需求,需要在删除一条数据的时候,和在数据中间插入一条数据的时候,后面的其他数据的这个字段都做调整,保持这个字段排序的连续,不能中断,有什么办法实现,业务场景就是要这个编号连续。不管是在中间删了,还是插入了。有什么好的实现思路吗?

加载中
0
else
else

触发?

0
求是科技
求是科技

两种方案:

1.在php层面完成

2.在mysql层面,采用存储过程。一旦有数据的删除/新增,都调用通用存储过程。

存储过程的功能,使传入编号后面的数据加1或者减1

linkfan
linkfan
如果数据量很大,比如在第二条后面插入了新数据,那么这之后的数据又几十万条,也能用存储过程来更新后面的?
0
wei2011
wei2011

其实你要的是行号吧。如果这样,你只需要把自增id排序,然后每次查询时生成行号就行了,永远是连续的,不管插入还是删除

wei2011
wei2011
回复 @linkfan : 你这个需求看起来和行号没区别啊。大不了做成一个view,把行号带上。或者每次增行把行号更新回一个字段
linkfan
linkfan
是行号我就不来提问了。
0
开源中国首席虾扯蛋
开源中国首席虾扯蛋

触发器或者PHP调用存储过程。如果只是为了前端显示行号的话,前端生成就行了。每次更新数据库效率太低,首先是一个遍历,再一个编码一般都是索引,更新索引效率更低

linkfan
linkfan
触发器和存储过程,这些感觉平时都没用到过,还得研究研究,但是这些真的能解决这个问题吗?数据量很大也能办到吗?
0
T
TimWong

不知道具体的需求,但简单看,这样的需求要慎重。。。

比如:我已有1000万条记录,id就是从1,2,3,4一至到1000万,好了,现在按你的需求,我要在1和2之间插入一条,那么,正常的逻辑是,1后面插入,那就是新插入的id=2,然后,原来id=2-1000万的记录全部要update一次。

如果你的记录不止1000万,又如果你每次都要在第1和第2之间插入。。。那后果几乎就是灾难性的。

所以,真要做这种需求,可以考虑的场景:

1. 总记录数可控(比如100条以内),保证每次update的记录不会太多

2. 如果仅仅是排序需要,可考虑使用小数代替整数,比如原来是1,2,3...现在要在1之后插入,那就找出大于1的第一条的值(2),然后在1和2之间取一个中间值(1.5)作为新的id

linkfan
linkfan
第一,总记录数不可控 第二,您提的第二条的第二点思路很好,但是他要求必须是整数。
0
夜苍狼
夜苍狼
你这需求已经奇葩的让人无法理解了
风翔飞
风翔飞
回复 @linkfan : 要学会拒绝需求,你得分析对面想要的到底是什么,不可能只有对方说的这一种方式
linkfan
linkfan
是啊。还给我来一句,就是这个要求。我表示很无力。
返回顶部
顶部