怎么定义int_面试官问: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,存在主键冲突的可能性。
所以,为了避免这种隐患,每个表都需要定一个主键。
“我是一名从事了10年开发在退休边缘垂死挣扎的高龄程序员,最近我花了一些时间整理了一个完整的学习C语言、C++的路线,项目源码和工具。对于想学习C/C++的小伙伴而言,学习的氛围和志同道合的伙伴很重要,笔者推荐一个C语言/C++编程爱好者的聚集地>>>C/C++编程技术学习交流聚集地,还有素材笔记和项目源码哦!
欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以一起学习!”
喜欢小编的记得动动您的小指点个关注哟!
怎么定义int_面试官问:MySQL的自增ID用完了,怎么办?!相关推荐
- 面试官问:如果MySQL的自增 ID 用完了,怎么办?
欢迎关注方志朋的博客,回复"666"获面试宝典 如果你用过或了解过MySQL,那你一定知道自增主键了.每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1).虽然,自然 ...
- 面试官问:MySQL 的自增 ID 用完了,怎么办?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:程序猿面试指南 既然这块知识点不清楚,那回头就自己动手实践下 ...
- 如果MySQL的自增 ID 用完了,怎么办?
作者 | 方志朋 来源 | https://mp.weixin.qq.com/s/Yqo5PaTtQcQTn4p8BE6SGg 如果你用过或了解过MySQL,那你一定知道自增主键了.每个自增id都是定 ...
- .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?
点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...
- 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?
以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...
- 【176期】面试官:MYSQL 表数据 delete 删除后,为何还占用存储空间?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... ...
- 【169期】面试官问:说说为什么要限流,有哪些解决方案?
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... ...
- 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化
转载自 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化 谁在消耗cpu? 用户+系统+IO等待+软硬中断+空闲 祸首是谁? 用户 用户空间CPU消耗,各种逻辑运算 正在进行大量tps 函数 ...
- 从面试官问“为什么选择mysql数据库”说开去
前几天面试,面试官问我:"为什么选择mysql数据库".现在想想,有如下的问题需要解决 关系型数据库有什么特点及举例 非关系型数据库有什么特点及举例 关系型数据库与非关系型数据库有 ...
最新文章
- 通过IP地址和子网掩码与运算计算相关地址
- 计算机史最疯狂一幕:豪赌50亿美元,“蓝色巨人”奋身一跃
- boost:从0到1开发boost(linux、clion)
- 各种排序算法总结篇(高速/堆/希尔/归并)
- python3菜鸟教程-Python3 循环语句
- hdu-Cube(三位树状数组)
- form表单中,file选择图片后预览
- DispatcherCore ,一个WPF异步操作常用功能库
- 自然语言处理中的Attention Model原理介绍
- 关于WPF的Binding 的 ConverterParameter 参数的动态设置
- MapX从数据库读取数据形成新图层【转载】
- 安装了谷歌服务框架还是闪退_小米手机安装谷歌服务(Google play)
- 利用dem生成横断面数据
- PostGIS测试 - 坐标系统(spatial_ref_sys)
- 面试官又问我Select * 为什么效率低下?
- 上帝掷骰子吗?量子物理史话——读书笔记
- python 程序运行时间长,python查看程序运行时间的方法
- ch341a编程和ttl刷机区别_USB转TTL(CH341A)的注意事项及说明
- svn 撤销已经add的文件
- python遇到错误跳过_python跳过错误
热门文章
- 怎么恢复php格式关联,SCN与数据恢复关联
- python获取列表序号_确定列表中的序列号(Python)
- insert时调用本身字段_python3调用企业微信api!开发一款属于自己的企业微信
- linux内核启动文件系统,Linux启动过程中文件系统的加载
- 导出指定字符集dmp文件_Oracle 11G数据库导入导出终极解决方案
- arraylist、map、queue、stack总结
- Java关键字volatile
- ide 两个模块的jdk版本不一样_Java平台模块系统(3)- JDK工具
- Hadoop(七)Hive基础
- Unity2018新功能抢鲜 | ShaderGraph实战教程之溶解效果