浅谈MySQL中的自增主键用完了怎么办
在面试中,大家应该经历过如下场景
面试官:"用过mysql吧,你们是用自增主键还是UUID?"
你:"用的是自增主键"
面试官:"为什么是自增主键?"
你:"因为采用自增主键,数据在物理结构上是顺序存储,性能最好,blabla…"
面试官:"那自增主键达到最大值了,用完了怎么办?"
你:"what,没复习啊!!" (然后,你就可以回去等通知了!)
这个问题是一个粉丝给我提的,我觉得挺有意(KENG)思(B)!
于是,今天我们就来谈一谈,这个自增主键用完了该怎么办!
正文
简单版
我们先明白一点,在mysql中,Int整型的范围如下
我们以无符号整型为例,存储范围为0~4294967295,约43亿!我们先说一下,一旦自增id达到最大值,此时数据继续插入是会报一个主键冲突异常如下所示
//Duplicate entry '4294967295' for key 'PRIMARY'
那解决方法也是很简单的,将Int类型改为BigInt类型,BigInt的范围如下
就算你每秒10000条数据,跑100年,单表的数据也才
10000*24*3600*365*100=31536000000000
这数字距离BigInt的上限还差的远,因此你将自增ID设为BigInt类型,你是不用考虑自增ID达到最大值这个问题!
然而,如果你在面试中的回答如果是
你:"简单啊,把自增主键的类型改为BigInt类型就好了!"
接下来,面试官可以问你一个更坑的问题!
面试官:"你在线上怎么修改列的数据类型的?"
你:"what!我还是回等通知吧!"
怎么改
目前业内在线修改表结构的方案,据我了解,一般有如下三种
方式一:使用mysql5.6+提供的在线修改功能
所谓的mysql自己提供的功能也就是mysql自己原生的语句,例如我们要修改原字段名称及类型。
mysql> ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
您可能感兴趣的文章
- 05-31MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
- 05-31MySQL索引失效十种场景与优化方案
- 05-31MYSQL 高级文本查询之regexp_like和REGEXP详解
- 05-31MySQL获取binlog的开始时间和结束时间(最新方法)
- 05-31MySQL索引查询的具体使用
- 05-31基于MySQL和Redis扣减库存的实践
- 05-31关于MySQL的存储过程与存储函数
- 05-31MySQL实战文章(非常全的基础入门类教程)
- 05-31MySQL Flink Watermark实现事件时间处理的关键技术
- 05-31MySQL Flink实时流处理的核心技术之窗口机制
阅读排行
推荐教程
- 05-30Navicat for MySQL 11注册码激活码汇总
- 05-27Mysql误删数据快速恢复
- 05-31VS2022连接数据库MySQL并进行基本的表的操作指南
- 05-30解决seata不能使用mysql8版本的问题方法
- 05-30MYSQL字符集设置的方法详解(终端的字符集)
- 05-30解决MySQL启动报错:ERROR 2003 (HY000): Can't con
- 05-30关于Mysql-connector-java驱动版本问题总结
- 11-22mac下安装mysql忘记密码的修改方法
- 05-30MySQL中的隐藏列的具体查看
- 11-22mysql exists与not exists实例详解