面试官:MySQL的自增ID用完了,怎么办?
既然这块知识点不清楚,那回头就自己动手实践下。
首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。
- create table t0(id int unsigned auto_increment primary key) ;insert
- into t0 values(null);
通过show命令 show create table t0; 查看表情况
- CREATE TABLE `t0` ( `id` int(10) unsigned NOT NULL 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(null);
同样,通过show命令,查看t1的表结构
- CREATE TABLE `t1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT
- CHARSET=utf8
可以发现,AUTO_INCREMENT已经变成4294967295了,当想再尝试插入一条数据时,得到了下面的异常结果
- 17:28:03 insert into t1 values(null) 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,存在主键冲突的可能性。
所以,为了避免这种隐患,每个表都需要定一个主键。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分布式数据库正连升三级
分布式数据库在去年突然成为热点技术,尤其是开源的分布式数据库,更被各家追捧。这个被谷歌、阿里等企业选用的分布式数据库实现连升三级。 技术升级 一般来讲数据库分为两大类,开源自建数据库和传统商业数据库。两种数据库在不同的环境下,各有优劣势,如MySQL开源数据库简单易用,有极高的稳定性,同时能够极大降低企业IT成本。 但是,面对大数据时代的到来,传统的数据库方式常常受制于价格、稳定等原因无法满足大数据时代的需求。分布式数据库提供了一种针对大数据,尤其是结构化数据的技术升级解决方案。 透明性、独立性、可恢复性与扩展能力是分布式数据库的主要优势。比如阿里在2008年提出“去IOE”口号后,就进入了MySQL时代。随着业务高速增长,也开始采用基于自研的一致性协议库X-Paxos的强一致性分布式系统,帮助企业解决处理大规模结构化数据。 生态升级 在传统的IOE模式中,IBM、Oracle和(原)EMC三家垄断IT生态。而在大数据时代,企业如果没有掌握数据,就无法掌握企业命脉,国家如果无法将数据掌握在自己手里,也十分危险。 在“去IOE”浪潮下,开源数据库开始在国内发展起来。这种变化直接影响了整个...
- 下一篇
Java并发编程之支持并发的list集合你知道吗
Java并发编程之-list集合的并发. 我们都知道Java集合类中的arrayList是线程不安全的。那么怎么证明是线程不安全的呢?怎么解决在并发环境下使用安全的list集合类呢? 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《并发集合系列》教程的第一篇: 本文主要内容:怎么证明arrayList不是线程安全的?怎么解决这个问题?以及遇到问题解决的四个步骤及从源码来分析作者思路。 一:怎么证明arrayList在并发情况下是线程不安全的呢? 创建一个list,用多个线程向list中添加数据。来看看结果 查看运行结果: 我们发现了一个异常:java.util.ConcurrentModificationException java.util.ConcurrentModificationException是什么 这个异常什么意思呢?我们来看看这个异常源码中类的注释信息: This exception may be thrown by methods that have detected concurrent(此异常可能由检测到并发的方法引发). 一般可以理解为,这是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS8编译安装MySQL8.0.19
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题