日期:2014-05-16  浏览次数:20802 次

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

------解决方案--------------------
1、可以手动指定ID值;
2、重新指定自增字段起始值
aLTER TABLE dd AUTO_INCREMENT = 1;
------解决方案--------------------
3、将数据导入到另一个有自增字段的表中。
------解决方案--------------------
自增字段设为bigint,几十年也用不完,断了就断了吧。。。。或者,你可以再加一个字段用来对断了的进行重置,就好像是oracle的rownum。
附代码:

SQL code

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: 0

mysql> 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>

------解决方案--------------------
如果你要重新对ID进行编号,只有导入到一张新的自增表中