MySQL:获取Auto_increment失败问题记录

项目场景:

人员权限设置,定义了一张存储自增id的表sys_id_sequence(A表)

复制代码
/*A表定义*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_id_sequence
-- ----------------------------
DROP TABLE IF EXISTS `sys_id_sequence`;
CREATE TABLE `sys_id_sequence`  (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `date_stamp` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1147 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

和一张人员权限表auth_rule_admin_role(B表),其中B表的主键为U+六位A表的自增主键,不足六位前置补零,例如U000001,每次插入B表前,先进行A表的插入删除,用来进行自增

复制代码
#插入自增序号                                
insert into sys_id_sequence (date_stamp)
          values(now());      

#删除自增序号
delete from sys_id_sequence;

这样,每次查询自增id就是最新的(不要问为啥这么设计,这个项目的司龄比我大)

复制代码
#获取自增id
select
        CONCAT('U', LPAD(CAST(
        (SELECT Auto_increment FROM information_schema.`TABLES` WHERE Table_Schema = 'tacs_specs'
        AND table_name = 'sys_id_sequence') AS CHAR),6,'0'));

然后把最新的自增id拼接好吐给B表即可


问题描述

获取自增id失败,通过查询sql查出来结果是0,导致插入B表失败


原因分析:

考虑过是MySQL版本问题,导致这样获取自增id失效,因此查看版本信息

复制代码
#版本
show VARIABLES like '%version%';

发现版本没问题,不是网上说的MySQL8失效问题,然后猜想是否因为A表为空导致,毕竟它执行了删除,因此插入一条数据,然后再获取,可以自增了,但是步长为2,看下步长设置吧

复制代码
#查询自增步长
SHOW VARIABLES LIKE '%auto_increment%';

给它步长设置为1

复制代码
#设置步长
SET auto_increment_increment=1

但是项目中明明是插入删除,运行了好几年都没问题,因此插入数据也不可靠,但是转念一想,是不是因为插入了数据给它重新赋值了当前的自增序号,因此,查下自增序列

复制代码
#查询当前自增序列
SHOW TABLE STATUS FROM tacs_specs LIKE 'sys_id_sequence';

果然如此,那么我们给它重置下自增序号即可,查询B表,找到最大的序号,设置为那个值即可(注:这里的截图我已经重置完成了)


解决方案:

重置自增序号

复制代码
#重置自增
alter table sys_id_sequence auto_increment=1147;

再次查询,序号没问题,然后让运维同事试着新增数据,成功,完美解决(猜想这个问题是因为服务关闭,MySQL重启导致自增序号失效,当然,MySQL获取自增id通过SELECT_LAST_INSERT()函数也可以,项目当初没有使用这个方法是在考虑线程安全问题吗?可这个项目没多少人用啊,搞不懂老项目...)

相关推荐
奇特認3 小时前
mysql 集群技术 3.高可用之 MHA
数据库·mysql
Bioinfo Guy5 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来
数据库·生物信息学·生信可视化
ltl7 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式
数据库
Blossom i9 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
InfinitePlus9 小时前
Docker MySQL搭建一主一从
mysql·docker
雾时之林10 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库
老纪的技术唠嗑局11 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
坐吃山猪11 小时前
Docker07-MySQL
mysql·docker·容器
CLOUD ACE12 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄12 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex