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你的身份缠绕的年数.
也就是说,只有谷歌需要在喝咖啡休息时偶尔模糊地考虑这个问题.
out*_*tis 45
吉姆马丁的评论来自§3.6.9.MySQL文档的"使用AUTO_INCREMENT":
万一有任何问题,AUTO_INCREMENT字段/ DOES NOT WRAP /.一旦达到字段大小的限制,INSERT就会生成错误.(根据Jeremy Cole的说法)
使用MySQL 5.1.45进行快速测试会导致以下错误:
ERROR 1467(HY000):无法从存储引擎读取自动增量值
您可以在插入时测试该错误并采取适当的措施.
通过查看最大的ID,您将知道它何时会溢出.你应该在任何异常甚至接近被抛出之前改变它.
实际上,您应该设计一个足够大的数据类型来开始.即使您从一开始就使用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
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助某个人.