当整数列上的auto_increment达到数据库中的max_value时会发生什么?

我正在实现一个数据库应用程序,我将同时使用JavaDB和MySQL作为数据库。 我在我的表中有一个ID列作为types​​的整数,我使用数据库的auto_increment函数的值。

但是,当我得到超过2(或4)亿个post和整数是不够的? 是整数溢出,并继续或是一个exception抛出,我可以处理?

是的,我可以改变只要数据types,但如何检查什么时候需要? 我认为,如果我使用long作为ID列的数据types,那么获取last_inserted_id()函数会有问题。

吉姆·马丁从第3.6.9节的评论。 MySQL文档中的“使用AUTO_INCREMENT”

以防万一有任何问题,AUTO_INCREMENT字段/不包括/。 一旦达到字段大小的限制,INSERT就会产生一个错误。 (根据Jeremy Cole)

使用MySQL 5.1.45进行快速testing会导致以下错误:

错误1467(HY000):无法从存储引擎读取自动递增值

您可以在插入时testing该错误并采取适当的措施。

只是为了镇定神经,考虑一下:

假设你有一个数据库,每次用户在你的网站上执行某种事务时,都会插入一个新的值。

以64位整数作为ID,那么这就是溢出的条件:世界人口为60亿,那么如果每个人每天每一秒执行一次交易,每一年和每年(没有rest),则需要超过80多less年来,你的ID来环绕。

也就是说,只有谷歌需要在rest时偶尔考虑这个问题。

通过查看最大的ID,你会知道什么时候会溢出。 在任何exception甚至接近被抛出之前,你应该改变它。

事实上,你应该devise一个足够大的数据types来开始。 即使您从一开始就使用64位ID,您的数据库性能也不会受到影响。

这里的答案说明会发生什么,但只有一个答案说如何检测问题(然后才发生错误)。 一般来说,能够在这些事情成为生产问题之前检测这些东西是有帮助的,所以我写了一个查询来检测何时会发生溢出:

SELECT c.TABLE_CATALOG, c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME FROM information_schema.COLUMNS AS c JOIN information_schema.TABLES AS t USING (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME) WHERE c.EXTRA LIKE '%auto_increment%' AND t.AUTO_INCREMENT / CASE c.DATA_TYPE WHEN 'TINYINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 255, 127) WHEN 'SMALLINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 65535, 32767) WHEN 'MEDIUMINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 16777215, 8388607) WHEN 'INT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', 4294967295, 2147483647) WHEN 'BIGINT' THEN IF(c.COLUMN_TYPE LIKE '% UNSIGNED', '18446744073709551615', 9223372036854775807) # need to quote because column type defaults to unsigned. ELSE 0 END > .9; # 10% buffer 

希望这可以帮助别人。

对于MySQL 5.6,3.6.9在AUTO_INCREMENT中使用说:

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

我想分享一下我刚才的个人经历。 使用Nagios + Check_MK + NDOUtils。 NDOUtils将所有检查存储在名为nagios_servicechecks的表中。 主键是一个auto_increment int signed。 MySQL限制范围之后会发生什么? 那么,在我的情况下,MySQL删除所有的logging,但最后一个。 桌子现在几乎是空的。 每次插入新logging时,都会删除旧logging。 不要为什么会这样,但事实是我失去了我的所有logging。 与Icinga(不是Nagios)一起使用的IDOUtils修正了这个问题,通过bigint修改int。 它没有产生错误。