★★★ 建议 星标 我们 ★★★
Java进阶架构师 ★ “ 星标 ”!这样才不会错过每日进阶架构文章呀。
2020年Java原创面试题库连载中
【000期】Java最全面试题库思维导图
【020期】JavaSE系列面试题汇总(共18篇)
【028期】JavaWeb系列面试题汇总(共10篇)
【042期】JavaEE系列面试题汇总(共13篇)
【049期】数据库系列面试题汇总(共6篇)
【053期】中间件系列面试题汇总(共3篇)
【065期】数据结构与算法面试题汇总(共11篇)
【076期】分布式面试题汇总(共10篇)
【077期】综合面试题系列(一)
【078期】综合面试题系列(二)
【079期】综合面试题系列(三)
【080期】综合面试题系列(四)
【081期】综合面试题系列(五)
【082期】综合面试题系列(六)
【083期】综合面试题系列(七)
【084期】综合面试题系列(八)
【085期】综合面试题系列(九)
【086期】综合面试题系列(十)
【087期】综合面试题系列(十一)
【088期】综合面试题系列(十二)
【089期】综合面试题系列(十三)
更多内容,点击上面蓝字查看
既然这块知识点不清楚,那回头就自己动手实践下。
首先,创建一个最简单的表,只包含一个自增 id,并插入一条数据。
通过 show 命令 show create table t0;
查看表情况
CREATE TABLE `t0` ( `id` int(10) unsigned NOT AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
可以发现 AUTO_INCREMENT 已经自动变成 2,这离用完还有很远,我们可以算下最大当前声明的自增 ID 最大是多少,由于这里定义的是 intunsigned
,所以最大可以达到 2 的 32 幂次方 – 1 = 4294967295
这里有个小技巧,可以在创建表的时候,直接声明 AUTO_INCREMENT 的初始值
create table t1(id int unsigned auto_increment primary key) auto_increment = 4294967295;insert into t1 values;
同样,通过 show 命令,查看 t1 的表结构
CREATE TABLE `t1` ( `id` int(10) unsigned NOT AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8
可以发现,AUTO_INCREMENT 已经变成 4294967295 了,当想再尝试插入一条数据时,得到了下面的异常结果
17:28:03 insert into t1 values Error Code: 1062. Duplicate entry '4294967295' for key 'PRIMARY' 0.00054 sec
说明,当再次插入时,使用的自增 ID 还是 4294967295
,报主键冲突的错误。
4294967295,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险, 建议采用 bigint unsigned ,这个数字就大了。
不过,还存在另一种情况,如果在创建表没有显示申明主键,会怎么办?
如果是这种情况,InnoDB 会自动帮你创建一个不可见的、长度为 6 字节的 row_id,而且 InnoDB 维护了一个全局的 dictsys.row_id,所以未定义主键的表都共享该 row_id,每次插入一条数据,都把全局 row_id 当成主键 id,然后全局 row_id 加 1
该全局 row_id 在代码实现上使用的是 bigint unsigned 类型,但实际上只给 row_id 留了 6 字节,这种设计就会存在一个问题: 如果全局 row_id 一直涨,一直涨,直到 2 的 48 幂次 – 1 时,这个时候再 + 1,row_id 的低 48 位都为 0,结果在插入新一行数据时,拿到的 row_id 就为 0,存在主键冲突的可能性。
所以,为了避免这种隐患,每个表都需要定一个主键。
来源:程序猿面试指南
之前,给大家发过三份Java面试宝典,这次新增了一份,目前总共是四份面试宝典,相信在跳槽前一个月按照面试宝典准备准备,基本没大问题。
《java面试宝典5.0》(初中级)
《350道Java面试题:整理自100+公司》(中高级)
《资深java面试宝典-视频版》(资深)
《Java[BAT]面试必备》(资深)
分别适用于初中级,中高级,资深级工程师的面试复习。
内容包含java基础、javaweb、mysql性能优化、JVM、锁、百万并发、消息队列,高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper、数据结构、限流熔断降级等等。
看到这里,证明有所收获