当前位置:  开发笔记 > 编程语言 > 正文

自动递增列用完后会发生什么?

如何解决《自动递增列用完后会发生什么?》经验,为你挑选了2个好方法。

考虑一个带有自动增量列的简单表,如下所示:

CREATE TABLE foo 
(
  `fooid` bigint unsigned NOT NULL auto_increment,
   ....snipped.... other columns
  PRIMARY KEY (`fooid`)
) 
ENGINE=InnoDB AUTO_INCREMENT=10

如何重新设计这个以便我们不会达到bigint数据类型的最大值?无符号范围是0到18446744073709551615.我不知道要达到18446744073709551615需要多长时间,但是就像Y2K问题一样,我想做好准备.



1> Jon Skeet..:

假设您每毫秒插入一行.

18446744073709551615毫秒= 18446744073709552秒= 307445734561826分钟= 5124095576030小时= 213503982335天= 584942417年

所以它不是真的像Y2K问题

你可以每毫秒插入一百万行,并且在500多年的时间里仍然可以.

换句话说:不要担心.


@Joey:所以你是因为我已经回答了实际被问到的问题,而不是你自己会问的那个问题,所以你对我投降了吗?奇.为什么不问你感兴趣的问题呢?我认为假设固定大小的整数在大小足够大时永远不会溢出是完全合理的.如果你开始假设你的应用程序需要运行超过500年,并且在那段时间内每毫秒达到100万次点击,你几乎肯定会过度使用它.
在遥远的未来,人们会在互联网上挖掘这一点并将@JonSkeet归咎于所有失败的应用程序,因为2008年不负责任的开发人员并不担心它:D
同样,如果您每秒只插入一次,那么您的应用程序将使用32位signed int运行68年.如果可以的话,每个记录保存4个字节并使用32位int.
我想知道如果你使用较小的类型(例如INT)会发生什么,它会溢出.假设一个固定大小的整数永远不会溢出,这不是一个前瞻性的想法.

2> flamingLogos..:

根据您使用的SQL模式,当AUTO_INCREMENT数值列的值超出范围时,MySQL会执行以下两种操作之一.在任何一种情况下都会出错,但原因各不相同.

严格模式下, MySQL拒绝超出范围值,抛出无效值错误,并且INSERT失败.在默认的非严格模式下, MySQL将值减少到数据类型允许的最高值,并执行INSERT.但是INSERT失败是因为该AUTO_INCREMENT属性已经导致所有可能的值已经被使用,并且您得到此错误(未签名的SMALLINT示例):

MySQL said:

#1062 - Duplicate entry '65535' for key 1

对于BIGINT此处的示例,将"65535"替换为18 quintillion,尽管生产数据库中不可能发生此错误.

但是如果你低估了应用程序生命周期中可能的键值(s 数),那么使用TINYINTs和SMALLINTs就很容易发生INSERT.想象一下,您正在更改代码并测试您的数据是否正确插入.突然你的应用程序退出处理上面的错误.您将更改回滚到已知良好的代码,但错误不会消失......非常令人沮丧.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有