MySQL自增主键用完报什么错?有什么建议?
JAVA前线
共 2788字,需浏览 6分钟
·
2022-06-06 19:09
JAVA前线
欢迎大家关注公众号「JAVA前线」查看更多精彩分享,主要内容包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时也非常欢迎大家加我微信「java_front」一起交流学习
0 实验准备
我们首先通过代码输出Integer和Long最大值:
public class IDTest {
public static void main(String[] args) {
System.out.println("JAVA Integer.MAX_VALUE = " + Integer.MAX_VALUE);
System.out.println("JAVA Long.MAX_VALUE = " + Long.MAX_VALUE);
}
}
// JAVA Integer.MAX_VALUE = 2147483647
// JAVA Long.MAX_VALUE = 9223372036854775807
1 试验一
CREATE TABLE `id_test_1` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`value` varchar(20) DEFAULT NULL COMMENT '值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483645 DEFAULT CHARSET=utf8;
insert into id_test_1(value) values ("a");
insert into id_test_1(value) values ("b");
insert into id_test_1(value) values ("c");
insert into id_test_1(value) values ("d");
abc可以正确插入数据表,但是插入d时报错:
Duplicate entry '2147483647' for key 'PRIMARY'
2 试验二
主键ID改为无符号int类型之后,abcd全部可以正确插入:
CREATE TABLE `id_test_2` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`value` varchar(20) DEFAULT NULL COMMENT '值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483645 DEFAULT CHARSET=utf8;
insert into id_test_2(value) values ("a");
insert into id_test_2(value) values ("b");
insert into id_test_2(value) values ("c");
insert into id_test_2(value) values ("d");
3 试验三
CREATE TABLE `id_test_3` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`value` varchar(20) DEFAULT NULL COMMENT '值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9223372036854775805 DEFAULT CHARSET=utf8;
insert into id_test_3(value) values ("a");
insert into id_test_3(value) values ("b");
insert into id_test_3(value) values ("c");
insert into id_test_3(value) values ("d");
abc可以正确插入数据表,但是插入d时报错:
Duplicate entry '9223372036854775807' for key 'PRIMARY'
4 试验四
主键ID改为无符号Long类型之后,abcd全部可以正确插入:
CREATE TABLE `id_test_4` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`value` varchar(20) DEFAULT NULL COMMENT '值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9223372036854775805 DEFAULT CHARSET=utf8;
insert into id_test_4(value) values ("a");
insert into id_test_4(value) values ("b");
insert into id_test_4(value) values ("c");
insert into id_test_4(value) values ("d");
5 试验总结
5.1 数值范围总结
Int有符号范围:[-2147483648,2147483647]
Int无符号范围:[0,4294967295]
Long有符号范围:[-9223372036854775808,9223372036854775807]
Long无符号范围:[0,18446744073709551615]
5.2 选择合适主键类型
如果希望单表可以存储尽可能多的数据,那么选择主键类型时Long优先于Int,无符号类型优先于有符号类型。
5.3 选择合适分库分表时机
阿里巴巴开发手册建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时就分库分表。
在业务初期可能并不用分库分表,但是随着业务发展,当单表记录数超过一定数量时就可以考虑分库分表,而不是等到自增主键用完时再分库分表,因为即使以有符号Int主键值上限分析,单表21亿数据也太多了。
关于分库分表原理以及如何进行分库分表实战,请参看笔者的两篇文章:
JAVA前线
欢迎大家关注公众号「JAVA前线」查看更多精彩分享,主要内容包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时也非常欢迎大家加我微信「java_front」一起交流学习
评论
面试官:MySQL自增主键为什么不是连续的?
程序员的成长之路互联网/程序员/技术/资料共享 关注 阅读本文大概需要 3 分钟。 来自:blog.csdn.net/jack1liu/article/details/99699201 一 前言 提出这个问题,是因为在工作中发现 mysql 中的 user 表的 id 默认...
程序员的成长之路
0
对 PhD 一年级新生有什么建议?
点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达来源 | 知乎问答地址 | https://www.zhihu.com/question/32210068本文仅作学术分享,若侵权请联系后台删文处理01回答一:作者-半个冯博士干你自己的事,别管人家是发了nat
小白学视觉
0
什么是电子名片,有什么作用?
电子名片也叫数字名片或者智能名片,有以下的一些特点:
1,现在市面上的电子名片基本上都是基于微信平台开发的。有H5,小程序等体现方式。
2,现在由少数公司在开发基于抖音的电子名片,但是从社交、销售的角度分析,微信的社交功能会更强大些。
3,基于微信开发的电子名片小程序,做的好我们认为有几个特点:带官网+可追踪客户+能获客。这样的功能就完全突破了纸质名片的能力了。
4,在展示方便,一个词可以形容:立体展示!为什么啦?电子名片可以展示文字、图片、视频、声音、链接跳转等。这些是纸质名片不具备的。
5,传播上。纸质名片必须面对面的赠送才可以。而电子名片。基于微信的生态流量,可以在微信群,朋友圈、个人、企业微信客户的无限制的转发。分
欧铂猎手智能电子名片
0
什么是电子名片,有什么作用?
纸质名片(传统小卡片)
纸质卡片,上面印有个人的姓名、地址、职务、电话号码、邮箱、单位名称、职业等。也是向对方推销介绍自己的一种方式。名片是新朋友互相认识、自我介绍的最快有效的方法。交换名片是商务交往的第一个标准仪式动作。使用场景:面对面交换纸质名片
电子名片(信息化名片)
图片格式卡片,把纸质名片转为图片格式,上面同样有个人的姓名、地址、职务、电话号码、邮箱、单位名称、职业等。电子名片是随着移动互联网的出现而出现,随着微信等社交软件的普及而普及。使用场景: 微信好友交换图片名片
数字化名片(智能化名片)
数字化卡片,把图片电子名片数字化,上面同样有个人的姓名、地址、职务、电话号码、邮箱、单位、职业等等。数字名片随着微信小
名片活动行
0