通过Hibernate来自动生成ID作为主键,用起来是方便了,但是有一个问题一直有点想不通,比如一个简单的消息数据库,每条消息的ID都是自动生成的,但是一旦我想删掉某条数据,那么新插入的数据是不会再沿用那个被删掉的ID了,这样一来岂不是ID的数子只会越来越大,请教各位~~~

解决方案 »

  1.   

    1、可以手动指定ID值;
    2、重新指定自增字段起始值
    aLTER TABLE dd AUTO_INCREMENT = 1;
      

  2.   

    1、重新指定自增字段起始值,难道可以这样?
    比如有1000条数据,其中ID为5、10、20、88等被删掉了,
    aLTER TABLE dd AUTO_INCREMENT = 1
    难道重置以后它会自动补齐上面这些被删掉的ID?2、将数据导入到另一个有自增字段的表中。
    意思就是说,隔上一段时间将旧表中的数据重新导入到一张新的自增表中,以此来维护表中ID的连续性?
      

  3.   

    自增字段设为bigint,几十年也用不完,断了就断了吧。或者,你可以再加一个字段用来对断了的进行重置,就好像是oracle的rownum。
    附代码:
    mysql> select * from test;
    +------+------+------+
    | id   | name | num1 |
    +------+------+------+
    |    1 | a    |    1 |
    |    2 | b    |    2 |
    |    3 | c    |    3 |
    |    5 | e    |    5 |
    |    6 | f    |    6 |
    +------+------+------+
    5 rows in set (0.00 sec)mysql> update test set num1=(select t.rownum from(
        -> select a.id,a.name,count(*) as rownum from test a,test b
        -> where a.num1>=b.num1 group by a.id,a.name) t where test.id=t.id);
    Query OK, 2 rows affected (0.02 sec)
    Rows matched: 5  Changed: 2  Warnings: 0mysql> select * from test;
    +------+------+------+
    | id   | name | num1 |
    +------+------+------+
    |    1 | a    |    1 |
    |    2 | b    |    2 |
    |    3 | c    |    3 |
    |    5 | e    |    4 |
    |    6 | f    |    5 |
    +------+------+------+
    5 rows in set (0.00 sec)mysql>