加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2019-09-20 21:33:29 所属栏目:编程 来源:Java高级技术架构
导读:既然这块常识点不清晰,那转头就本身下手实践下。 起首,建设一个最简朴的表,只包括一个自增id,并插入一条数据。 createtablet0(idintunsignedauto_incrementprimarykey); insertintot0values(null); 通过show呼吁 show create table t0; 查察心环境 CRE

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

既然这块常识点不清晰,那转头就本身下手实践下。

起首,建设一个最简朴的表,只包括一个自增id,并插入一条数据。

  1. create table t0(id int unsigned auto_increment primary key) ; 
  2. insert into t0 values(null); 

通过show呼吁 show create table t0; 查察心环境

  1. CREATE TABLE `t0` ( 
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  3. PRIMARY KEY (`id`) 
  4. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 

可以发明 AUTO_INCREMENT 已经自动酿成2,这离用完尚有很远,我们可以算下最大当前声明的自增ID最大是几多,因为这里界说的是 intunsigned,以是最大可以到达2的32幂次方 - 1 = 4294967295

这里有个小能力,可以在建设表的时辰,直接声明AUTO_INCREMENT的初始值

  1. create table t1(id int unsigned auto_increment primary key) auto_increment = 4294967295; 
  2. insert into t1 values(null); 

同样,通过show呼吁,查察t1的表布局

  1. CREATE TABLE `t1` ( 
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  3. PRIMARY KEY (`id`) 
  4. ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8 

可以发明,AUTO_INCREMENT已经酿成4294967295了,当想再实行插入一条数据时,获得了下面的非常功效

  1. 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,存在主键斗嘴的也许性。

以是,为了停止这种隐患,每个表都必要定一个主键。

【编辑保举】

  1. 一文看懂MySQL怎样查察数据库表容量巨细
  2. 12个合用于DBA的数据库打点和开拓的SQL器材
  3. MySQL EXPLAIN功效集说明 - 附带大量案例
  4. 基于时序数据库做监控,这里有超风行的开源方案
  5. MySQL中常见的字符串函数应用详解
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读