【问题标题】:Mysql Myisam re-using auto-incremented ids that are deletedMysql Myisam 重新使用已删除的自动递增 id
【发布时间】:2012-06-08 22:14:27
【问题描述】:

我有一张桌子:测试

id int(10) 自增 名称字符(36)

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

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

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

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

-汤姆

【问题讨论】:

    标签: mysql primary-key auto-increment myisam


    【解决方案1】:
    1. mysql 会重新使用这些已删除的 id 吗?

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

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

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

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

    3. 如果我在使用自动增量时“id-out-of-id”会发生什么?

      the manual中所述:

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

    【讨论】:

      【解决方案2】:
      1. 不,MySQL 不会重用已删除记录中的 ID
      2. 您真的需要吗?如果您的自动增量列的类型是 BIGINT,那么您有 18446744073709551615 个可能的 ID

      【讨论】:

        【解决方案3】:

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

        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?

        不推荐。

        【讨论】:

        • 好的,但是有什么方法可以将它设置为自动执行此操作?重置后自动递增时是否会跳过现有 ID?
        猜你喜欢
        • 2013-09-12
        • 1970-01-01
        • 2014-10-01
        • 2016-05-05
        • 1970-01-01
        • 2016-02-19
        • 2013-08-27
        • 2012-07-08
        • 2012-11-18
        相关资源
        最近更新 更多