原帖地址
http://topic.csdn.net/u/20071126/14/b8205301-ded3-40aa-8bc3-55d186eacb5d.html
-------------------------------------------------------------------------------------------
提问者:wxq4100798
----------------------------
数据库里ID 有值 1,2,4,6,10,我怎么得到3,5,7,8,9,有什么好放法 将他补齐
就是说,将数据库ID 补成连续的
变成123456789
设表名为 table ,怎么做
-------------------------------------------------------------------------------------------
回答者:SysTem128
----------------------------
测试数据是这样的
a表 id,body 两字段.
30w数据量
删除了id为 295010和295027 的数据
以下为查询语句及其结果.
第一句查询到删除条的前一数据.
如果你比较懒可以直接使用第二条拿到已删除编号.
这种方法只能取出最小的被删除编号.
同样也可以重新构造取出最大的被删除编号.
mysql> set @kid=1; select id,body,@kid:=@kid+1 as kid from a where id
< @kid+1 order by kid desc limit 1;
Query OK, 0 rows affected
+--------+------+--------+
| id | body | kid |
+--------+------+--------+
| 295009 | abbs | 295010 |
+--------+------+--------+
1 row in set
mysql> set @kid=1; select id+1,@kid:=@kid+1 as kid from a where id <
@kid+1 order by kid desc limit 1;
Query OK, 0 rows affected
+--------+--------+
| id+1 | kid |
+--------+--------+
| 295010 | 295010 |
+--------+--------+
1 row in set
忘了最后要回答你的问题了.
得到这个编号(295010)后
插入时编号就写 295010.
然后再取最小已删除编号,插入,补全就可以.
问题的关键在于找到已被删除的编号有哪些.
insert a (id,body) values(295010,'test');
Query OK, 1 row affected
set @kid=1; select id+1,@kid:=@kid+1 as kid from a where id < @kid+1
order by kid desc limit 1;
Query OK, 0 rows affected
+--------+--------+
| id+1 | kid |
+--------+--------+
| 295027 | 295027 |
+--------+--------+
1 row in set