考虑一个带有自动增量列的简单表,如下所示:
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问题一样,我想做好准备.
假设您每毫秒插入一行.
18446744073709551615毫秒= 18446744073709552秒= 307445734561826分钟= 5124095576030小时= 213503982335天= 584942417年
所以它不是真的像Y2K问题
你可以每毫秒插入一百万行,并且在500多年的时间里仍然可以.
换句话说:不要担心.
根据您使用的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 数),那么使用TINYINT
s和SMALLINT
s就很容易发生INSERT
.想象一下,您正在更改代码并测试您的数据是否正确插入.突然你的应用程序退出处理上面的错误.您将更改回滚到已知良好的代码,但错误不会消失......非常令人沮丧.