灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2990回复:0

[mysql]MySQL自增主键删除后重复问题

楼主#
更多 发布于:2013-05-25 15:10
MySQL自增主键删除后重复问题
 
这是我同事的一个朋友遇到的问题,标题可能有些拗口,我重现下场景:
 
设置一张MySQL表,表里有一个自增主键ID,往表里插入数据,假如插入数据之后表最后一行的ID是100,我先删除这条ID为100的记录,然后重新启动服务器,按理说如果再往这个表里插入新的记录,新纪录的ID将为101,对吧?估计大家都是这么想的,但是,结果是:如果你的表类型是InnoDB,那么,新纪录的ID为100;如果你的表类型是MyISAM,那么,新纪录的ID为101。但是,如果我们在删除了ID为100的纪录,但是没有重新启动服务器的条件下,再新增一条新纪录,新纪录的自增ID都为101。
 
为什么会出现这种现象?
 
这是由于不同的表类型保存自增ID的地方不同:InnoDB类型的数据表将表最后的ID值保存在内存里面。所以,当我们重新启动服务器后,内存里面的数据清空,那么自增的ID将重新按照现有表的纪录计算;相反,如果是MyISAM类型的数据表,将最大纪录ID保持在文件里,这样,虽然,重启了服务器,下次插入新纪录的时候,自增ID通过读取文件而计算得到。
 
如何解决这个问题?
 
相信大家都能想到的办法就是:不重启服务器。但是,有些情况下,不得不重启下服务器,由于服务器很长时间高速运转必须重新启动一下。也有朋友会回答,将表结构都设置为MyISAM类型,只要是在不影响现有业务的前提下,都是可行的。这里,我分享下我的方法:我的方法很简单,其实,我们压根就没有必要说删除那些记录,很多情况下,我们设置的表自增ID是没有多大意义的,那么,我们可以在表结构新增加一个字段来标示这条记录是否有效,如status字段,1表示有效,0表示失效,如果,不希望看到哪些记录,只要将这些记录的status字段值设置为0即可,下次新增记录ID还是会如期自增的。

喜欢0 评分0
游客

返回顶部