我有一张桌子:测试
id int(10) 自动递增名称 char(36)
现在让我们说我从 ID 1000 => 最大唯一 ID 号填充的整个表。ID 1 - 1000 = 之前已删除。
问题1;mysql 会重新使用这些删除的 id 吗?问题2; 如果没有,我该如何进行自动增量或任何重用表中不存在的唯一标识符?
我问的原因是我的表将包含很多条目,并且很多条目将一直被删除。当我在使用自动增量时“用完 ID”时会发生什么?
感谢您对此的任何启发:)
-汤姆
我有一张桌子:测试
id int(10) 自动递增名称 char(36)
现在让我们说我从 ID 1000 => 最大唯一 ID 号填充的整个表。ID 1 - 1000 = 之前已删除。
问题1;mysql 会重新使用这些删除的 id 吗?问题2; 如果没有,我该如何进行自动增量或任何重用表中不存在的唯一标识符?
我问的原因是我的表将包含很多条目,并且很多条目将一直被删除。当我在使用自动增量时“用完 ID”时会发生什么?
感谢您对此的任何启发:)
-汤姆
mysql 会重新使用这些删除的 id 吗?
开始时,它通过查找现有记录的最大值(并加 1)mysqld
来确定每列的下一个值。AUTO_INCREMENT
因此,如果删除最高值的记录并重新启动服务器,删除的 id 确实会被重用。
否则,只有在您手动更改下一个值时才会重用AUTO_INCREMENT
值(不推荐这样做,因为它不是并发安全的):
ALTER TABLE foo AUTO_INCREMENT = 12345;
如果没有,我该如何进行自动增量或任何重用表中不存在的唯一标识符?
一般来说,你不会:考虑重新设计你的数据结构,以便插入/删除不会以这种方式发生,或者使用更大的整数类型(BIGINT UNSIGNED
是 8 个字节,所以可以达到 2^64 或 ~10^19 )。
当我在使用自动增量时“用完 ID”时会发生什么?
如手册所述:
AUTO_INCREMENT
对足够大的列使用最小的整数数据类型,以容纳您需要的最大序列值。当列达到数据类型的上限时,下一次生成序列号的尝试失败。
你需要重置自动增量,自动增量只是不断增加,如果你不设置它至少不会回去。
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?
不建议这样做。