口试官问:MySQL的自增ID用完了,怎么办?
既然这块常识点不清晰,那转头就本身下手实践下。 起首,建设一个最简朴的表,只包括一个自增id,并插入一条数据。
通过show呼吁 show create table t0; 查察心环境
可以发明 AUTO_INCREMENT 已经自动酿成2,这离用完尚有很远,我们可以算下最大当前声明的自增ID最大是几多,因为这里界说的是 intunsigned,以是最大可以到达2的32幂次方 - 1 = 4294967295 这里有个小能力,可以在建设表的时辰,直接声明AUTO_INCREMENT的初始值
同样,通过show呼吁,查察t1的表布局
可以发明,AUTO_INCREMENT已经酿成4294967295了,当想再实行插入一条数据时,获得了下面的非常功效
声名,当再次插入时,行使的自增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,存在主键斗嘴的也许性。 以是,为了停止这种隐患,每个表都必要定一个主键。 【编辑保举】
点赞 0 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |