mysql数据表中,有几条记录主键id为1,2,3,4,5,把id为5的这条数据删了。如果下次再insert一条数据的话

mysql数据表中,有几条记录主键id是1,2,3,4,5,我设置了AUTO_INCREMENT,但是当我把id=5的数据删掉后,我又insert一条数据,此时id竟然是6,不是5,为什么啊?谁帮我解决下呗。。。

数据库实现自增长都是通过一个变量来实现的,就是AUTO_INCREMENT。每次插入一条数据,变量加1。你删除数据它不可能回滚,试想如果你觉得删除一条数据它就减1,你删除最大的那个ID自然没有问题,但如果你删除的是3而不是5,数据库无论将它变成5或者3都不合适,因为如果是5,显然ID为5的数据已经存在,你再次插入数据会违反主键唯一性;如果是3呢,新插入两条数据时,同样有这个问题,所以它只能不变。而且你非要再在5那插一条数据意义也不大,你可以通过指定ID来插入数据,不需要改变自增变量。在你不能确定有没有ID值比你要改的ID大时,最好不要随便改自增变量。追问

也就是说:我有1,2,3,4,5,五条数据,我删掉了id=5的数据(最大id值),我再插入一条新数据,数据表会自动把它编号为id=6,是么?这是正常的么?

追答

对,这很正常。auto_increment只会在你插入数据的时候自增,不会在你删除的时候减1。数据库这样处理是合理的,因为数据库没办法预先知道你删除的是哪条数据,如果有100条数据,你删除id为5的,难道数据库还把auto_increment返回到5吗,显然不行,因为这样做的话,后面你再插入数据,自增id为5,这个没问题,可以插入;可是插入id为5的后,auto_increment编成6,如果你再插入数据,就是插入id为6的,但先前已经存在id为6的数据,这样的话数据库就不能插入数据了。

你可以通过指定id来插入数据
insert into tablename(id,others) values(5,others);
这样就可以没有任何影响的将数据插入到id为5的位置。

追问

谢谢你的回答!那要是我想把数据往页面上输出怎么办?
开始是:id=1 name=1// 第一行
id=2 name=2 //第二行
id=3 name=3//第三行
delete id=3 后,又insert id=4:之后输出,不就变成断行了?
id=1 name=1// 第一行
id=2 name=2 //第二行
//第三行
id=4 name=4 //第四行
如何解决这个问题呢?我是菜鸟,求指教!!!!!!!!

追答

从数据库输出数据到页面肯定不是按你说的那样输出,一般都是从数据拿到所有要输出的数据,放在数组之类的容器里,然后根据容器的下标来输出。在放进容器的时候,你可以按照数据的id排序,这样输出的时候就是按id的顺序输出了。

比如说你拿到所有的数据:
select * from tablename order by id;
编程语言都有能拿到结果集的类,这样你就得到了所有的数据。这些数据你经过处理,就可以放进数组或是集合等容器,然后你要输出这些数据的时候,只要把集合或容器中的数据显示在页面上。由于容器都是通过下标来访问的,只要用for或者while,参数就是下标,肯定不会出现某一行为空的现象。

所以说这个所谓的断行,你根本不用考虑,只要做一段时间的程序,就知道这根本不是问题。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-21
将ID设置为INT就OK, CREATE TABLE TB_NAME( ID INT IDENTITY(1,1), ) IDENTITY是自动增长参数,(1,1)表示初始值为1,行增量为1 改成追问

id 是int啊?

第2个回答  2012-03-21
1、你可以用show create table tablename;查看AUTO_INCREMENT的值。
插入5行数据后,AUTO_INCREMENT=6,即使你把所有的数据都删除。
2、执行alter table tablename AUTO_INCREMENT=5;再插入即可。追问

哥哥,我说的id值,1,2,3,4,5, 只是打个比方,那要是有个3000个id值得表,你说我到时候前台插入数据,我还去查么?

第3个回答  2012-03-21
alter table tbname auto_increment=5;
这样就能重新从5开始了