您当前所在位置:首页软件教程数据库mysql修改自增主键数值无效的解决办法

mysql修改自增主键数值无效的解决办法

归类:数据库更新时间:2023-12-04 21:57:29作者:互联网人气:155

MySQL是一种常用的关系型数据库,其主键自增长功能可以方便地实现数据的唯一性和快速查询。但是,在实际应用中,有时候需要修改主键自增长的值,而MySQL默认情况下是不允许修改主键自增长的值的。在实际应用中我们实现MySQL主键自增长的同时又会遇到主键数据无效的情况,那么我们要如何解决呢。

mysql修改自增主键数值无效

假如你的数据表中的数据如下图所示:

2023071410095510.png

把自增主键的数值(AUTO_INCREMENT)设置为小于等于100的值(以数值50举例),我们可以看到mysql显示修改成功

2023071410095511.png

此时再次添加数据并查询所有数据,发现主键id居然依旧从100开始继续增长

2023071410095512.png

查询AUTO_INCRMENT数值发现数值为null

2023071410095513.png

因为表中存在比你要修改AUTO_INCREMENT值大的主键id,导致无法把AUTO_INCREMENT修改为50,而且不会有任何报错,所以不要把AUTO_INCREMENT修改为小于 最大主键id 的值

mysql自增主键重复问题的可能

MySQL支持数据字段自增,可以用来作为数据表的主键字段。

自增字段的定义和题外话

看一个数据表的创建实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DROP TABLE IF EXISTS `spgl_dfxmsplcxxb`;
CREATE TABLE `spgl_dfxmsplcxxb` (
  `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水号',
  `DFSJZJ` varchar(50) NOT NULL COMMENT '地方数据主键',
  `XZQHDM` varchar(6) NOT NULL COMMENT '行政区划代码',
  `SPLCBM` varchar(100) NOT NULL COMMENT '审批流程编码',
  `SPLCMC` varchar(200) NOT NULL COMMENT '审批流程名称',
  `SPLCBBH` double(4,1) NOT NULL COMMENT '审批流程版本号',
  `SPLCSXSJ` datetime NOT NULL COMMENT '审批流程生效时间',
  `SPLCLX` int(11) NOT NULL COMMENT '审批流程类型',
  `SPLCSM` varchar(2000) DEFAULT NULL COMMENT 'SPLCSM',
  `FJMC` varchar(512) NOT NULL COMMENT '附件名称',
  `FJLX` varchar(64) NOT NULL COMMENT '附件类型',
  `FJID` varchar(100) NOT NULL COMMENT '附件ID',
  `SJYXBS` int(11) NOT NULL COMMENT '数据有效标识',
  `SJWXYY` varchar(200) DEFAULT NULL COMMENT '数据无效原因',
  `SJSCZT` int(11) NOT NULL COMMENT '数据上传状态',
  `SBYY` varchar(1000) DEFAULT NULL COMMENT '失败原因',
  PRIMARY KEY (`LSH`),
  KEY `unique_main` (`XZQHDM`,`SPLCBM`,`SPLCBBH`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='表1:地方项目审批流程信息表';

该表将LSH字段设置为自增主键,并默认auto_increment_increment=1、auto_increment_offset=1。

对该表执行show create table spgl_dfxmsplcxxb可以得到如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `spgl_dfxmsplcjdxxb` (
  `LSH` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水号',
  `DFSJZJ` varchar(50) NOT NULL COMMENT '地方数据主键',
  `XZQHDM` varchar(6) NOT NULL COMMENT '行政区划代码',
  `SPLCBM` varchar(100) NOT NULL COMMENT '审批流程编码',
  `SPLCBBH` double(4,1) NOT NULL COMMENT '审批流程版本号',
  `SPJDBM` varchar(100) DEFAULT NULL COMMENT '审批阶段编码',
  `SPJDMC` varchar(200) NOT NULL COMMENT '审批阶段名称',
  `SPJDXH` int(11) NOT NULL COMMENT '审批阶段序号',
  `DYBZSPJDXH` varchar(200) NOT NULL COMMENT '对应标准审批阶段序号',
  `SPJDSX` int(11) NOT NULL COMMENT '审批阶段时限',
  `LCBSXLX` int(11) NOT NULL COMMENT '里程碑事项类型',
  `SJYXBS` int(11) NOT NULL COMMENT '数据有效标识',
  `SJWXYY` varchar(200) DEFAULT NULL COMMENT '数据无效原因',
  `SJSCZT` int(11) NOT NULL COMMENT '数据上传状态',
  `SBYY` varchar(1000) DEFAULT NULL COMMENT '失败原因',
  PRIMARY KEY (`LSH`),
  KEY `unique_main` (`XZQHDM`,`SPLCBM`,`SPLCBBH`,`SPJDXH`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表2:地方项目审批流程阶段信息表'

自增字段重复问题

对于表的记录间互相拷贝问题很容易造成自增字段的重复。

例如在我经历的一次项目:本地数据库和前置数据库进行数据同步时,本地库向前置库上传数据,前置库插入传来的数据并返回自增字段流水号更本地库。同步每3分种依据标志位检查执行一次。

这样,如果对本地库数据进行多次修改,那么就需要向前置库多次上传该条记录(或该条记录的拷贝记录)。

如果没有在上传前手动将前置库返回的流水号置为空,那么前置库将会用这个已有的流水号作为主键插入新数据(而不是重新生成新的流水号),从而导致主键重复的错误。

所以,在处理含有自增字段的表格时,如果自增字段和其他表格有数据上的关联,应当注意这种操作会不会导致自增字段的冲突。


本文地址:http://9zoku.com/database/232.html
版权声明:本文内容来自互联网,该文版权归原作者所有。本站仅提供信息存储空间服务,不拥有文章所有权,不承担相关法律责任。若对本内容有异议或投诉请与管理员联系 5604882#qq.com(请将#换成@)。
MySQL数据库