mysql数据库里有自增字段,就是每添加一条记录,自增id会自动加1,
比如我有20条记录,id依次为1,2,3,...20 删掉10,11,...20,我知道
不能随便改自增字段id的值,删后中间就空出一些数字,再加记录时,id便
自动设为21,22,....此时表中的字段id为:1,2,...8,9,21,22,...
    如果我的系统在日常使用中经常有删除、添加记录的操作,那么删掉的
id都是前面的数字,新增的id都是后面的数字。。过很久后,id的值会非常大,
可前面的数字却空着并未使用,这样一来随着时间的推移,id总会有崩溃的那天
吧,因为id是int,int型字段的字节数是固定,有个最大整数值是它的上限。
    这个问题怎么解决?难道用自增字段的系统只要经常增删改查,尤其存储
记录量较多时,过些时间系统一定崩溃?

解决方案 »

  1.   

    如果你选用 unsigned BIGINT 则可以最多到 18446744073709551615 你的这个问题基本上所有数据库都会遇到,甚至包括我的网卡的MAC地址等都有个容量的限制,只不过一般来说这个数字已经足够大了。
      

  2.   

    mysql> select auto_increment from information_schema.tables where table_name='test';
    +----------------+
    | auto_increment |
    +----------------+
    |             23 |
    +----------------+
    1 row in set (0.02 sec)
    找到id没有的值 在插入 但是这种方法很不实用
    一个表如果太大了 就没什么意义了 可以做两张表或者多张表存储数据
      

  3.   

        谢谢上面的三位大侠,意思就没根本的方法去解决?有时我想如果一个大型论坛(如csdn,哈哈)、或网银(尽管它采用了更强的数据库Oracle等)这样每分每秒都要操作大量数据的系统,过个几年系统岂不是一定玩完?在系统玩完时有些数据如银行账户记录却是绝对不能丢失的,银行再利用备份重新构建新系统?
      

  4.   


    这个就是前面说的表设计组织考虑问题了,举个例子吧,我以前处理过的一个有一定数据量的系统,一天产生的新数据几亿条吧,也有自增id,如果像你这么说,把数据都往一个表里面对的话,肯定是不可行的(首先不考虑自增id超出范围的角度,最少进行业务处理时就有相当多问题),我那时采用了历史数据分表分区,当然啦,入库源表还可以考虑利用oracle的sequence的循环属性处理,这就是一种表设计的逻辑处理方法,当然啦,具体应用具体分析啦。
      

  5.   

    楼主这是搞测试呢 一定是写个死循环 测试bigint范围呢