MySQL的自增ID(主键) 用完了的解决方法

 更新时间:2020年09月11日 11:01:49   作者:铭之博客  
这篇文章主要介绍了MySQL的自增ID(主键) 用完了的解决方法,帮助大家更好的理解和学习MySQL数据库,感兴趣的朋友可以了解下

在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值。一般情况下初始值都是从 0 开始,然后按照一定的步长增加(一般是自增 1)。一般情况下,我们都是用int(11)来作为数据表的自增 ID,在 MySQL 中只要定义了这个数的字节长度,那么就会有上限。

MySQL的自增ID(主键) 用完了,怎么办?

如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂次方 - 1 = 4294967295。

这里有个小技巧,可以在创建表的时候,直接声明AUTO_INCREMENT的初始值为4294967295。

create table `test` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295;

SQL插入语句

insert into `test` values (null);

当想再尝试插入一条数据时,得到了下面的异常结果。

[SQL] insert into `test` values (null);
[Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'

说明,当再次插入时,使用的自增ID还是 4294967295,报主键冲突的错误,这说明 ID 值达到上限之后,就不会再变化了。4294967295,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险,建议采用 bigint unsigned ,这个数字就大了。

bigint unsigned 的范围是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字), 存储大小为 8 个字节。

不过,还存在另一种情况,如果在创建表没有显示申明主键,会怎么办?

如果是这种情况,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,存在主键冲突的可能性。

所以,为了避免这种隐患,每个表都需要定一个主键。

总结

数据库表的自增 ID 达到上限之后,再申请时它的值就不会在改变了,继续插入数据时会导致报主键冲突错误。因此在设计数据表时,尽量根据业务需求来选择合适的字段类型。

以上就是MySQL的自增ID(主键) 用完了的解决方法的详细内容,更多关于MySQL 自增ID(主键)的资料请关注脚本之家其它相关文章!

相关文章

  • 在Debian 9系统上安装Mysql数据库的方法教程

    在Debian 9系统上安装Mysql数据库的方法教程

    这篇文章主要给大家介绍了在Debian 9系统上安装Mysql数据库的方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • MHA实现mysql主从数据库手动切换的方法

    MHA实现mysql主从数据库手动切换的方法

    这篇文章主要介绍了MHA实现mysql主从数据库手动切换的方法,详细的讲述了主从数据库切换的步骤与方法,非常实用,需要的朋友可以参考下
    2014-10-10
  • MySQL的中文UTF8乱码问题

    MySQL的中文UTF8乱码问题

    MySQL从4.x版本开始支持Unicode,3.x只有latin1编码。刚工作的时候就开始用MySQL了,用的php存取,网页xxx.php是gb2312的编码,存进去的数据用php取出来是中文,用phpMyAdmin执行select、update、dump都是中文,没有乱码问题。
    2010-05-05
  • MySQL 慢查询日志的开启与配置

    MySQL 慢查询日志的开启与配置

    这篇文章主要介绍了MySQL 慢查询日志的开启与配置的方法,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。下面就谈谈他们的区别和怎么选择,需要的朋友可以参考一下
    2021-09-09
  • MySQL数据库之联合查询 union

    MySQL数据库之联合查询 union

    这篇文章主要介绍了MySQL数据库之联合查询 union,联合查询就是将多个查询结果的结果集合并到一起,字段数不变,多个查询结果的记录数合并,下文详细介绍需要的小伙伴可以参考一下
    2022-06-06
  • mysql建立自定义函数的问题

    mysql建立自定义函数的问题

    由于这几天在写mysql存储过程且发现程序体积越来越庞大,于是尝试使用mysql的函数
    2011-04-04
  • MySQL表的内外连接和视图使用实战练习

    MySQL表的内外连接和视图使用实战练习

    这篇文章主要给大家介绍了关于MySQL表的内外连接和视图使用的相关资料,MySQL的内外连接查询是用于将两个或多个表中的数据进行关联查询的一种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • MySQL创建定时任务

    MySQL创建定时任务

    本文详细讲解了MySQL创建定时任务的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Mac下安装mysql5.7.18的详细步骤

    Mac下安装mysql5.7.18的详细步骤

    这篇文章主要为大家详细介绍了]Mac下安装mysql5.7.18的详细步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论