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

Jon*_*nas 64 database integer-overflow auto-increment lastinsertid

我正在实现一个数据库应用程序,我将使用JavaDB和MySQL作为数据库.我的表中有一个ID列,其类型为整数,我使用数据库auto_increment-function作为值.

但是当我获得超过2(或4)亿个帖子和整数时,会发生什么呢?整数溢出并继续或者是我可以处理的异常抛出?

是的,我可以更改为数据类型,但如何检查何时需要?我认为获取last_inserted_id()函数是有问题的,如果我使用long作为ID列的数据类型.

小智 49

为了平息神经,请考虑以下事项:

假设您有一个数据库,每次用户在您的网站上执行某种交易时都会插入一个新值.

使用64位整数作为ID然后这是溢出的条件:如果世界人口为60亿,那么如果地球上的每个人每天每年执行一次交易(每天不休息),则需要超过80你的身份缠绕的年数.

也就是说,只有谷歌需要在喝咖啡休息时偶尔模糊地考虑这个问题.

  • 对不起,只是为了纠正它需要超过9年:) 1分钟后,360法案将发生tnx.1小时后,21600法案.在1天内,将验证518,440亿tnx.1年:1892160千亿.8年后,数据库中将保存15,137,280千亿.UNSIGNED BIGINT的限制为18,446,744千亿. (4认同)
  • 你将这一个额外零一年.所以它将是97年左右. (2认同)
  • 对我来说,“int(10) unsigned”,id 列在短短 2 个月内就达到了“237836414”,即 uint_max 的 5.54%。所以,这是一个问题。 (2认同)

out*_*tis 45

吉姆马丁的评论来自§3.6.9.MySQL文档的"使用AUTO_INCREMENT":

万一有任何问题,AUTO_INCREMENT字段/ DOES NOT WRAP /.一旦达到字段大小的限制,INSERT就会生成错误.(根据Jeremy Cole的说法)

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

ERROR 1467(HY000):无法从存储引擎读取自动增量值

您可以在插入时测试该错误并采取适当的措施.


Mat*_*nen 9

通过查看最大的ID,您将知道它何时会溢出.你应该在任何异常甚至接近被抛出之前改变它.

实际上,您应该设计一个足够大的数据类型来开始.即使您从一开始就使用64位ID,您的数据库性能也不会受到影响.


CST*_*bey 6

这里的答案陈述了会发生什么,但只有一个答案说明如何检测问题(然后只有在错误发生后).通常,能够在它们成为生产问题之前检测到这些内容是有帮助的,因此我编写了一个查询来检测溢出即将发生的时间:

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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某个人.