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

来源:脚本之家  责任编辑:小易  

直接改肯定不行,得先把id删了,然后再创建一个字段id,删除字段时先把主键去掉www.zgxue.com防采集请勿采集本网。

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

你设置id值非空,并且自增长就行了啊,也就是 not null 和 autoincrement 希望可以帮到您,谢谢!

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

-- 创建表CREATE TABLE `t2` ( `code` varchar(100) DEFAULT NULL,) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 添加主键ALTER TABLE `t2` ADD

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

`id` int(11) NOT NULL auto_increment,(auto_increment控制主键自曾1) `gidmysql 建立用户 mysql使用方法 建立mysql数据库链接 mysql 登录 其他类似问题

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

在现在的情况下就算是设置了 alter table tableName auto_increment=1, 等你再次插入的时候还是从1001开始 。 如果你是为了让id连贯起来,可以将701-1000数据的ID

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

第一条为0的只能手工操作,在命令上输入:SET sql_mode='NO_AUTO_VALUE_ON_ZERO' 如下: mysql> SET sql_mode='NO_AUTO_VALUE_ON_ZERO'; Query

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(主键)的资料请关注真格学网其它相关文章! 您可能感兴趣的文章:关于mysql自增id,你需要知道的MySQL表自增id溢出的故障复盘解决关于MySQL自增ID的一些小问题总结关于Mysql自增id的这些你可能还不知道MySQL自增ID耗尽实例讲解mysql自增id超大问题的排查与解决MySQL分表自增ID问题的解决方法两种mysql对自增id重新从1排序的方法利用mysql事务特性实现并发安全的自增ID示例mysql自增ID起始值修改方法

方法一: 如果2113曾经的数据都不需5261要的话,可以直接清空所有数据,4102并将自增字段恢复从16531开始计数 truncate table 表名 方法二: dbcc checkident (’table_name’, reseed, new_reseed_value) 当前值设置为 new_reseed_value。如果自创建表后没有将行插入该表,则在执行 DBCC CHECKIDENT 后插入的第一行将使用 new_reseed_value 作为标识。否则,下一个插入的行将使用 new_reseed_value + 1。如果 new_reseed_value 的值小于标识列中的最大值,以后引用该表时将产生 2627 号错误信息。 方法二不会清空已有数据,操作比较灵活,不仅可以将自增值归零,也适用于删除大量连续行后,重新设置自增值并插入新的数据;或从新的值开始,当然不能和已有的冲突。 $sql="delete from $table_vote"; mysql_query($sql, $link); $sql="alter table $table_vote auto_increment=1"; mysql_query($sql, $link);,问题描述清楚,需要自增还是不需要,完全不懂内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • centos7下二进制安装mysql 5.7.23
  • mysql myisam默认存储引擎实现原理
  • mysql 发生系统错误1067的解决方法
  • mysql导入sql脚本错误:2006 解决方法
  • mysql 数据类型timestamp
  • windows下安装mysql-8.0.18-winx64的教程(图文详解)
  • mysql数据库基础知识点与操作小结
  • mysql 5.7.5 m15 winx64.zip安装教程
  • mysql服务器的启动与停止(二)
  • mysql无法启动、无法停止解决方法(安全设置后容易出现)
  • mysql 主键自增 怎么处理
  • mysql 现有一表 主键是Int 自增 ID满了 改不了bigi...
  • mysql 主键 自增 达到 最大 怎么办
  • mysql表已经建立完毕id是主键,现在想把id设置成自...
  • mysql数据库怎么让id自动增长,但ID不是主键。难道...
  • 如何修改mysql主键(id)的值为自增
  • 建立一张mysql的表 已有了ID 将ID设置成 主键自动增加
  • mysql自增ID重置的问题
  • MySql 设置ID主键自增,从0开始,请问怎么设?
  • mysql中主键自动增长时的几种情况
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页关于mysql自增id,你需要知道的mysql表自增id溢出的故障复盘解决关于mysql自增id的一些小问题总结关于mysql自增id的这些你可能还不知道mysql自增id耗尽实例讲解mysql自增id超大问题的排查与解决mysql分表自增id问题的解决方法两种mysql对自增id重新从1排序的方法利用mysql事务特性实现并发安全的自增id示例mysql自增id起始值修改方法centos7下二进制安装mysql 5.7.23mysql myisam默认存储引擎实现原理mysql 发生系统错误1067的解决方法mysql导入sql脚本错误:2006 解决方法mysql 数据类型timestampwindows下安装mysql-8.0.18-winx64的教程(图文详解)mysql数据库基础知识点与操作小结mysql 5.7.5 m15 winx64.zip安装教程mysql服务器的启动与停止(二)mysql无法启动、无法停止解决方法(安全设置后容易出现)mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql日期数据类型、时间类型使用mysql——修改root密码的4种方法mysql update语句的用法详解mysql之timestamp(时间戳)用法什么是分表和分区 mysql数据库分区和分表解决navicat导入数据库数据结构sql报错damysql 表的垂直拆分和水平拆分mysql 5.6.13 免安装版配置方法详解php中关于mysqli和mysql区别的一些知识点mysql添加新用户及为用户创建数据库和给用mysql索引操作命令小结mysql数据库设计三范式实例解析mysql报错:deadlock found when trying mysql定时删除过期数据记录的简单方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved