ash*_*aka 23 mysql database-design
考虑一个带有自动增量列的简单表,如下所示:
CREATE TABLE foo
(
`fooid` bigint unsigned NOT NULL auto_increment,
....snipped.... other columns
PRIMARY KEY (`fooid`)
)
ENGINE=InnoDB AUTO_INCREMENT=10
Run Code Online (Sandbox Code Playgroud)
如何重新设计这个以便我们不会达到bigint数据类型的最大值?无符号范围是0到18446744073709551615.我不知道要达到18446744073709551615需要多长时间,但是就像Y2K问题一样,我想做好准备.
Jon*_*eet 58
假设您每毫秒插入一行.
18446744073709551615毫秒= 18446744073709552秒= 307445734561826分钟= 5124095576030小时= 213503982335天= 584942417年
所以它不是真的像Y2K问题
你可以每毫秒插入一百万行,并且在500多年的时间里仍然可以.
换句话说:不要担心.
fla*_*gos 18
根据您使用的SQL模式,当AUTO_INCREMENT数值列的值超出范围时,MySQL会执行以下两种操作之一.在任何一种情况下都会出错,但原因各不相同.
在严格模式下, MySQL拒绝超出范围值,抛出无效值错误,并且INSERT失败.在默认的非严格模式下, MySQL将值减少到数据类型允许的最高值,并执行INSERT.但是INSERT失败是因为该AUTO_INCREMENT属性已经导致所有可能的值已经被使用,并且您得到此错误(未签名的SMALLINT示例):
MySQL said:
#1062 - Duplicate entry '65535' for key 1
Run Code Online (Sandbox Code Playgroud)
对于BIGINT此处的示例,将"65535"替换为18 quintillion,尽管生产数据库中不可能发生此错误.
但是如果你低估了应用程序生命周期中可能的键值(s 数),那么使用TINYINTs和SMALLINTs就很容易发生INSERT.想象一下,您正在更改代码并测试您的数据是否正确插入.突然你的应用程序退出处理上面的错误.您将更改回滚到已知良好的代码,但错误不会消失......非常令人沮丧.