【问题标题】:MySQL Auto-Increment Issue with Numbering编号的 MySQL 自动增量问题
【发布时间】:2012-04-02 14:06:37
【问题描述】:

我的数据库中有一个包含大约 500 万条记录的表,我注意到每条记录的 ID 在每次插入时都不会增加一个。

例如,我有以下架构设置:

我的表 activity_id INT(11) PRIMARY (AUTO_INCREMENT),created_at DATETIME

如果我查看表格并按日期时间排序,数字不是连续的。实际上,似乎 MySQL 正在寻找何时删除,然后在其中添加新记录。

Edit    Delete  5000089     2012-03-17 04:31:46
Edit    Delete  5000087     2012-03-17 04:31:44
Edit    Delete  5000086     2012-03-17 04:31:43
Edit    Delete  5000085     2012-03-17 04:31:43
Edit    Delete  5000084     2012-03-17 04:31:31
**Edit  Delete  5000088     2012-03-17 04:31:30**
**Edit  Delete  5000076     2012-03-17 04:31:30**
Edit    Delete  5000082     2012-03-17 04:31:29

正如您在格林威治标准时间 4:31:30 的信息中看到的那样,我们有 2 个插入,其中应该有 83 和 84,但它奇怪地增加了。来自应用程序的数据库插入未指定 ID,并且 activity_id 的字段设置为 Auto_increment。

对于为什么会发生这种情况,任何帮助都会非常有用。

有没有人见过这样的东西?

【问题讨论】:

  • 只是好奇,但如果它们与日期不连续,为什么这很重要?
  • 我们应该假设datetime值是由mysql中的NOW()生成的,还是在一组独立的clent应用程序中生成的?

标签: mysql database primary-key


【解决方案1】:

auto-increment documentation 有这一段:

在这种情况下(当 AUTO_INCREMENT 列是 多列索引),如果删除,则重用 AUTO_INCREMENT 值 任何组中具有最大 AUTO_INCREMENT 值的行。这 甚至对于 AUTO_INCREMENT 值的 MyISAM 表也会发生 通常不会重复使用。

这似乎暗示索引值在 InnoDB 表中被重用,在某些情况下在 MyISAM 表中。因此,如果您删除一行,MySQL 可能会使用旧行的 ID 创建一个新行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多