国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

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

发布时间:2019/09/18标签:   主键    点击量:

原标题:面试官问:MySQL的自增ID用完了,怎么办?
面试官问:MySQL的自增ID用完了,怎么办?既然这块常识点不清晰,那回首就本人着手实际下。起首,创立一个最简略的表,只包括一个自增id,并拔出一条数据。createtablet0(idintunsignedauto_incrementprimarykey);insertintot0values(null);经过show下令 show create table t0; 检查心情况CREATETABLE`t0`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8能够发觉 AUTO_INCREMENT 曾经主动酿成2,这离用完另有很远,咱们能够算下最大以后申明的自增ID最大是几多,因为这里界说的是 intunsigned,以是最大能够到达2的32幂次方 - 1 = 4294967295这里有个小技能,能够在创立表的时间,间接申明AUTO_INCREMENT的初始值createtablet1(idintunsignedauto_incrementprimarykey)auto_increment=4294967295;insertintot1values(null);一样,经过show下令,检查t1的表构造CREATETABLE`t1`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=4294967295DEFAULTCHARSET=utf8能够发觉,AUTO_INCREMENT曾经酿成4294967295了,当想再实验拔出一条数据时,失掉了上面的异样成果17:28:03insertintot1values(null)ErrorCode:1062.Duplicateentry'4294967295'forkey'PRIMARY'0.00054sec阐明,当再次拔出时,应用的自增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,存在主键抵触的能够性。以是,为了幸免这类隐患,每个表都须要定一个主键。【编纂推举】一文看懂MySQL怎样检查数据库表容量巨细12个实用于DBA的数据库治理和开辟的SQL东西MySQL EXPLAIN成果集剖析 - 附带大批案例基于时序数据库做监控,这里有超风行的开源计划MySQL中罕见的字符串函数利用详解【义务编纂:庞桂玉 TEL:(010)68476606】 点赞 0

上一篇:这6种编码方法,你掌握了几个?

下一篇:没有了

返回
版权信息Copyright © 银河官网 版权所有    ICP备案编号:鲁ICP备09013610号