目录
- mysql修改自增主键数值无效
- mysql自增主键重复问题的可能
- 自增字段的定义和题外话
- 自增字段重复问题
- 总结
mysql修改自增主键数值无效
假如你的数据表中的数据如下图所示:
把自增主键的数值(AUTO_INCREMENT)设置为小于等于100的值(以数值50举例),我们可以看到mysql显示修改成功
此时再次添加数据并查询所有数据,发现主键id居然依旧从100开始继续增长
查询AUTO_INCRMENT数值发现数值为null
因为表中存在比你要修改AUTO_INCREMENT值大的主键id,导致无法把AUTO_INCREMENT修改为50,而且不会有任何报错,所以不要把AUTO_INCREMENT修改为小于 最大主键id 的值
mysql自增主键重复问题的可能
MySQL支持数据字段自增,可以用来作为数据表的主键字段。
自增字段的定义和题外话
看一个数据表的创建实例:
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可以得到如下信息:
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分种依据标志位检查执行一次。
这样,如果对本地库数据进行多次修改,那么就需要向前置库多次上传该条记录(或该条记录的拷贝记录)。
如果没有在上传前手动将前置库返回的流水号置为空,那么前置库将会用这个已有的流水号作为主键插入新数据(而不是重新生成新的流水号),从而导致主键重复的错误。
所以,在处理含有自增字段的表格时,如果自增字段和其他表格有数据上的关联,应当注意这种操作会不会导致自增字段的冲突。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持悠久资源网。