既然这块知识点不清楚,那回头就自己动手实践下。

首先,创建一个最简单的表,只包含一个自增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用完了,怎么办?!相关推荐

  1. 面试官问:如果MySQL的自增 ID 用完了,怎么办?

    欢迎关注方志朋的博客,回复"666"获面试宝典 如果你用过或了解过MySQL,那你一定知道自增主键了.每个自增id都是定义了初始值,然后按照指定步长增长(默认步长是1).虽然,自然 ...

  2. 面试官问:MySQL 的自增 ID 用完了,怎么办?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:程序猿面试指南 既然这块知识点不清楚,那回头就自己动手实践下 ...

  3. 如果MySQL的自增 ID 用完了,怎么办?

    作者 | 方志朋 来源 | https://mp.weixin.qq.com/s/Yqo5PaTtQcQTn4p8BE6SGg 如果你用过或了解过MySQL,那你一定知道自增主键了.每个自增id都是定 ...

  4. .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...

  5. 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...

  6. 【176期】面试官:MYSQL 表数据 delete 删除后,为何还占用存储空间?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... ...

  7. 【169期】面试官问:说说为什么要限流,有哪些解决方案?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... ...

  8. 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化

    转载自  面试官问:如果MySQL引起CPU消耗过大,你会怎么优化 谁在消耗cpu? 用户+系统+IO等待+软硬中断+空闲 祸首是谁? 用户 用户空间CPU消耗,各种逻辑运算 正在进行大量tps 函数 ...

  9. 从面试官问“为什么选择mysql数据库”说开去

    前几天面试,面试官问我:"为什么选择mysql数据库".现在想想,有如下的问题需要解决 关系型数据库有什么特点及举例 非关系型数据库有什么特点及举例 关系型数据库与非关系型数据库有 ...

最新文章

  1. 通过IP地址和子网掩码与运算计算相关地址
  2. 计算机史最疯狂一幕:豪赌50亿美元,“蓝色巨人”奋身一跃
  3. boost:从0到1开发boost(linux、clion)
  4. 各种排序算法总结篇(高速/堆/希尔/归并)
  5. python3菜鸟教程-Python3 循环语句
  6. hdu-Cube(三位树状数组)
  7. form表单中,file选择图片后预览
  8. DispatcherCore ,一个WPF异步操作常用功能库
  9. 自然语言处理中的Attention Model原理介绍
  10. 关于WPF的Binding 的 ConverterParameter 参数的动态设置
  11. MapX从数据库读取数据形成新图层【转载】
  12. 安装了谷歌服务框架还是闪退_小米手机安装谷歌服务(Google play)
  13. 利用dem生成横断面数据
  14. PostGIS测试 - 坐标系统(spatial_ref_sys)
  15. 面试官又问我Select * 为什么效率低下?
  16. 上帝掷骰子吗?量子物理史话——读书笔记
  17. python 程序运行时间长,python查看程序运行时间的方法
  18. ch341a编程和ttl刷机区别_USB转TTL(CH341A)的注意事项及说明
  19. svn 撤销已经add的文件
  20. python遇到错误跳过_python跳过错误

热门文章

  1. 怎么恢复php格式关联,SCN与数据恢复关联
  2. python获取列表序号_确定列表中的序列号(Python)
  3. insert时调用本身字段_python3调用企业微信api!开发一款属于自己的企业微信
  4. linux内核启动文件系统,Linux启动过程中文件系统的加载
  5. 导出指定字符集dmp文件_Oracle 11G数据库导入导出终极解决方案
  6. arraylist、map、queue、stack总结
  7. Java关键字volatile
  8. ide 两个模块的jdk版本不一样_Java平台模块系统(3)- JDK工具
  9. Hadoop(七)Hive基础
  10. Unity2018新功能抢鲜 | ShaderGraph实战教程之溶解效果