【问题标题】:What happens when auto increment primary key in MySQL comes to maximum当 MySQL 中的自增主键达到最大值时会发生什么
【发布时间】:2013-07-02 22:55:52
【问题描述】:

我有自动增量,MySQL 中的主键称为 ID,它是 INT。 随着我的应用程序的增长和我获得更多用户,他们正在制作更多条目。当我的 INT 达到最大值 2 147 483 647 时会发生什么? 我可以切换到 BIGINT 吗?

【问题讨论】:

  • 为什么不首先使用 BIGINT?
  • 可能是重复的问题stackoverflow.com/questions/2615417/…
  • 好吧,因为我的应用程序现在非常小,我认为使用 INT 就足够了。这是非常相似的问题。谢谢
  • 你只完成了 7% 的溢出。你确定是时候大惊小怪了吗?只有 Facebook 和 Twitter 拥有真正的 十亿 用户。在接下来的十年中,您需要每秒有 6 个用户注册才能耗尽它。
  • 这可能对你有帮助,我在github.com/billkarwin/bk-tools 创建了几个 SQL 脚本,告诉你你离溢出自动增量列和任何其他 INT 列有多近。查看文件pk-full-ratio.sqlint-full-ratio.sql

标签: mysql int primary-key auto-increment


【解决方案1】:

我想分享一下我刚刚对此的个人经历。

使用 Nagios + Check_MK + NDOUtils。 NDOUtils 将所有检查存储在一个名为 nagios_servicechecks 的表中。主键是auto_increment int signed

当这个限制在一定范围内时,MySQL 会发生什么?好吧,就我而言,MySQL 删除了除最后一条之外的所有记录。桌子现在几乎是空的。每次插入新记录时,都会删除旧记录。

我不知道为什么会发生这种情况,但事实是我丢失了所有记录。

IDOUtils 与 Icinga(不是 Nagios)一起使用,修复了这个问题,将 int 更改为 bigint。

【讨论】:

    【解决方案2】:

    是的,您可以毫无问题地更改表并从 INT 更改为 BIGINT。

    此外,您可能需要更改作为 FK 的数据类型

    【讨论】:

    • +1 是的,值得一提的是,您应该升级它们引用的PK 之前更改FK 数据类型。否则,您可能会创建子表无法引用的 PK 值。
    【解决方案3】:

    MySQL official documentation 声明:

    当列达到数据类型的上限时,下一个 尝试生成序列号失败。使用未签名 属性如果可能允许更大的范围。

    是的,您可以切换auto_increment 值的类型。在这一点上,文档建议使用:

    [...] AUTO_INCREMENT 列的最小整数数据类型 足以容纳您需要的最大序列值。

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2019-03-30
      相关资源
      最近更新 更多