2

我有一张桌子:测试

id int(10) 自动递增名称 char(36)

现在让我们说我从 ID 1000 => 最大唯一 ID 号填充的整个表。ID 1 - 1000 = 之前已删除。

问题1;mysql 会重新使用这些删除的 id 吗?问题2; 如果没有,我该如何进行自动增量或任何重用表中不存在的唯一标识符?

我问的原因是我的表将包含很多条目,并且很多条目将一直被删除。当我在使用自动增量时“用完 ID”时会发生什么?

感谢您对此的任何启发:)

-汤姆

4

3 回答 3

3
  1. mysql 会重新使用这些删除的 id 吗?

    开始时,它通过查找现有记录的最大值(并加 1)mysqld来确定每列的下一个值。AUTO_INCREMENT因此,如果删除最高值的记录并重新启动服务器,删除的 id 确实会被重用。

    否则,只有在您手动更改下一个值时才会重用AUTO_INCREMENT值(推荐这样做,因为它不是并发安全的):

    ALTER TABLE foo AUTO_INCREMENT = 12345;
    
  2. 如果没有,我该如何进行自动增量或任何重用表中不存在的唯一标识符?

    一般来说,你不会:考虑重新设计你的数据结构,以便插入/删除不会以这种方式发生,或者使用更大的整数类型(BIGINT UNSIGNED是 8 个字节,所以可以达到 2^64 或 ~10^19 )。

  3. 当我在使用自动增量时“用完 ID”时会发生什么?

    手册所述:

    AUTO_INCREMENT对足够大的列使用最小的整数数据类型,以容纳您需要的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试失败。

于 2012-06-04T21:04:52.023 回答
1
  1. 不,MySQL 不会重用已删除记录中的 ID
  2. 你真的需要吗?如果您的自动增量列的类型是 BIGINT,那么您有 18446744073709551615 个可能的 ID
于 2012-06-04T20:49:57.703 回答
0

你需要重置自动增量,自动增量只是不断增加,如果你不设置它至少不会回去。

alter table tablename auto_increment=value

像这样

mysql> alter table t1 auto_increment=200;
Query OK, 202 rows affected (0.04 sec)
Records: 202  Duplicates: 0  Warnings: 0

编辑:如果你删除一些记录,auto_increment 将是“最后一个值+1”,不管你做什么,只有当你删除整个表时,你才能“重新开始”。

最好使用触发器,但触发器不能更改表(http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

所以你的最后一个选择是存储过程,看看这里:Is it possible to alter a table in mySql via stored procedures?

不建议这样做。

于 2012-06-04T20:46:59.937 回答