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