【问题标题】:Any way around InnoDB autoincrementing on IGNORE?有什么办法可以在 IGNORE 上自动递增 InnoDB?
【发布时间】:2012-03-25 13:43:37
【问题描述】:

使用 InnoDB,无论何时执行 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE,无论是否插入任何内容,它都会自动递增表。

这个问题真烦人。

有什么简单的方法吗?

【问题讨论】:

  • 这不是问题,这是一个理想的功能。 不应该解决它,但我感觉到代表猎人建议更改表格并重置增量计数。只是不要这样做。
  • 许多个月前,我被说服放手而不必担心数据库表中单调增加的 id。我想我从此过上了更幸福的生活
  • 只是好奇,您正在开发什么应用程序,这甚至是一个问题?让数据库做它的事情。如果您尝试获取最后一个插入 ID,那么您应该将查询包装在事务中。如果您担心 id 用完,请确保您的 id col 设置为 unsigned。
  • 是的,我认为我内心的强迫症需要放手。问题是我正在运行定期检查数据的 cron 作业,然后将任何新内容插入数据库。所以每次它运行脚本时,我都会在自动增量中出现巨大的差距。
  • @NathanWaters:我会专注于找出交易失败的原因,而不是担心自动增量 ID 的差距。

标签: mysql innodb auto-increment on-duplicate-key


【解决方案1】:

InnoDB 允许您回滚事务。这意味着您可以插入到一个表中,但无法将相关记录插入到另一个表中,然后回滚第一个插入。在此期间,第一个表中可能会发生其他插入,这也需要唯一的 ID。在这种情况下,您不能放弃已分发的自动增量。

在 INSERT IGNORE 上,InnoDB 只能通过尝试插入来判断是否已经存在记录。它需要在插入之前自动递增。您不能先搜索然后插入,因为其他进程可能正在执行相同的操作并在选择和插入之间插入相同的记录。

除非您认为您会超过该字段的最大值,否则您应该担心它。对于 bigint,这是非常大的。 Facebook 使用的是 bigint,还没有用完。

【讨论】:

    【解决方案2】:

    您可以使用特殊的互斥表模仿 INSERT IGNORE 行为。

    参考这篇文章:

    Avoiding auto-increment holes on InnoDB with INSERT IGNORE

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2022-06-21
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      相关资源
      最近更新 更多