当MySQL中的自增主键达到最大值时会发生什么?

9

我在MySQL中有一个名为ID的自增主键,它是INT类型。随着我的应用程序越来越受欢迎并且有更多的用户进行更多的条目插入,当我的INT值达到最大值2147483647时会发生什么?

我是否可以切换到BIGINT?


1
为什么你不一开始就使用BIGINT呢? - Ran Eldan
这可能是一个重复的问题 https://dev59.com/YHE85IYBdhLWcg3wx2n2 - Ricardo Marimon
因为我的应用程序现在非常小,我认为使用INT就足够了。这是一个相当类似的问题。谢谢。 - FosAvance
3
你只用了溢出的7%。你确定现在是慌张的时候吗?仅Facebook和Twitter就有数十亿的用户。你需要每秒钟让6个用户连续注册十年才会用尽它。 - tadman
我并没有惊慌失措,我只是想知道会发生什么。这不仅涉及用户,还包括他们所做的条目,例如在数据库中插入数据。 - FosAvance
1
这可能会对您有所帮助,我在 https://github.com/billkarwin/bk-tools 创建了几个 SQL 脚本,可以告诉您距离自动递增列和任何其他 INT 列溢出有多远。请查看文件 pk-full-ratio.sqlint-full-ratio.sql - Bill Karwin
3个回答

6

是的,您可以更改表并将数据类型从INT更改为BIGINT而不会出现问题。

此外,您可能需要在任何作为外键的地方更改数据类型。


4
+1 是的,值得一提的是,在升级它们所引用的PK之前,您应更改FK数据类型。否则,您可能会创建无法被子表引用的PK值。 - Bill Karwin

5

MySQL官方文档指出:

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

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

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


0

我想分享一下我刚刚遇到的个人经历。

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

当MySQL达到此限制时会发生什么?好吧,在我的情况下,MySQL删除了除最后一个记录之外的所有记录。该表现在几乎为空。每次插入新记录时,旧记录都会被删除。

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

IDOUtils与Icinga(而不是Nagios)一起使用,通过将int更改为bigint来解决了此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接