在真实的代码中,表中还有其他列,它们也出现在INSERT查询中,但我们可以放心地忽略它们,因为它们对这个特定问题没有任何价值。 当列id的值达到其最大值时,无法使用上面的查询在表中插入更多行。下一个INSERT将失败,并显示错误: SQL错误(167):列“id”的值超出范围。 如果id列的值中有间隙,则仍然可以插入使用表中不存在的值的行,但必须在INSERT查询中指定id的值。 无论如何,如果AUTO_INCREMENT列的类型是BIGINT,则不必担心。 假设代码每秒插入100万条记录(这被高估了,但不能说是不可能的),那么id列有足够的值供下一个half of million years使用,或者如果该列不是UNSIGNED,则只有292,277年的值。 我在一个实时的Web服务器上目睹了这种行为,该服务器使用INT(11)(而不是UNSIGNED)作为记录网站访问信息的表的AUTO_INCREMENT ed PK。经过几年的平稳运行,当访问量达到2^31(2十亿左右)时,它在半夜失败了。 将列类型从INT更改为BIGINT并不是处理20亿条记录表的解决方案(要花很长时间才能完成,而且当系统运行时,时间永远不够)。解决方案是创建一个结构相同的新表,但PK列为BIGINT,AUTO_INCREMENT列为初始值,然后切换表:
CREATE TABLE `tbl_new` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=2200000000;
RENAME TABLE `tbl` TO `tbl_old`, `tbl_new` TO `tbl`;
3条答案
按热度按时间euoag5mw1#
让我们假设一个表结构如下:
和
INSERT
查询,如:在真实的代码中,表中还有其他列,它们也出现在
INSERT
查询中,但我们可以放心地忽略它们,因为它们对这个特定问题没有任何价值。当列
id
的值达到其最大值时,无法使用上面的查询在表中插入更多行。下一个INSERT
将失败,并显示错误:SQL错误(167):列“id”的值超出范围。
如果
id
列的值中有间隙,则仍然可以插入使用表中不存在的值的行,但必须在INSERT
查询中指定id
的值。无论如何,如果
AUTO_INCREMENT
列的类型是BIGINT
,则不必担心。假设代码每秒插入100万条记录(这被高估了,但不能说是不可能的),那么
id
列有足够的值供下一个half of million years使用,或者如果该列不是UNSIGNED
,则只有292,277
年的值。我在一个实时的Web服务器上目睹了这种行为,该服务器使用
INT(11)
(而不是UNSIGNED
)作为记录网站访问信息的表的AUTO_INCREMENT
ed PK。经过几年的平稳运行,当访问量达到2^31
(2
十亿左右)时,它在半夜失败了。将列类型从
INT
更改为BIGINT
并不是处理20亿条记录表的解决方案(要花很长时间才能完成,而且当系统运行时,时间永远不够)。解决方案是创建一个结构相同的新表,但PK列为BIGINT
,AUTO_INCREMENT
列为初始值,然后切换表:ezykj2lf2#
你认为这个数字很小吗?也许你还没达到这个数字就已经死了
jucafojl3#