MySQL:获取Auto_increment失败问题记录

2023-09-19 13:44:19

项目场景:

人员权限设置,定义了一张存储自增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()函数也可以,项目当初没有使用这个方法是在考虑线程安全问题吗?可这个项目没多少人用啊,搞不懂老项目…)

更多推荐

如何通过快解析测试接口内外网?本地内网ip让外网访问连接

接口调试测试是网络技术员经常工作内容之一。如在公司内部api项目webserver测试,在公司内办公室个人电脑是正常用内网IP访问连接测试的,但在外网电脑需要远程测试时需要怎么测试呢?这里提供一种内网地址让外网访问的通用方法:快解析内网映射。内网地址在外网访问的原理主要是通过快解析软件方式,将本地内网地址转换成外网可以

adb操作及常用命令

问题:nodevices/emulatorsfound:adbdevices没有连接的设备解决方案:大概率是因为usb调试功能没有打开,可以查看手机设备是否开启usb调试功能Android若未开启,可通过设置-关于手机,连续点击版本号7次,打开开发者模式后开启usb调试常用命令汇总查看连接计算机的设备:adbdevic

基于SpringBoot+Vue的旅游管理系统

目录前言一、技术栈二、系统功能介绍登录界面管理员功能模块用户功能模块三、核心代码1、登录模块2、文件上传模块3、代码封装前言随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,旅游网站当然也不能排除在外,随着旅游网站的不断成熟,它彻底改变了过去传统的旅游网站方式,不仅使旅游管理难度变

WebGIS开发教程:mapbox和Cesium的区别

Mapbox和Cesium都是WebGIS领域中的开源⼯具,它们都提供了丰富的地图显示和数据可视化功能,而且都能实现三维可视化开发,但是他们在某些方面确实有一定区别。1.定位不同:Mapbox更注重静态地图和动态地图的制作和展示,特别是在移动设备和Web应用程序中的实现方面,提供了强⼤的地图渲染引擎和⼯具,能够快速构建

华为数字能源,开启超充新纪元

编辑:阿冒设计:沐由在过去很长的一段时间里,国内某著名品牌火锅是从来不担心获客的。顶峰时期,该品牌每年服务超过1.6亿人次的顾客,翻台率达到了5次/天,几乎创下了餐饮界的最高翻台率。翻台率是餐饮企业最为重要的指标之一,就如同当前风风火火的充电站。任谁都能明白无误地看出,伴随着国内新能源汽车产业规模的不断扩大,投资充电站

大型架构设计的演进之路

Java全能学习+面试指南:https://javaxiaobear.cn今天我们一起看看大型互联网系统架构的演进之路,主要包含三部分内容。第一部分是大型互联网系统的特点,分析大型互联网有哪些特点和挑战,它们是现在一些技术和架构方案产生的原因。第二部分是系统处理能力提升的两种途径,提供了两种面对挑战的解决思路。第三部分

Java-day14(多线程)

多线程0.基本概念程序:为完成特定任务,用某种编程语言编写的一组指令的集合(静态)进程:程序的一次执行过程,或正在执行的一个程序(动态过程)线程:程序内部的一条执行路径,若某个程序支持同一时间执行多个线程,即支持多线程1.多线程的创建和使用继承Thread类创建多线程一个线程只能执行一次start()不能通过Threa

VR科普研学基地科普开放日普乐蛙VR体验馆沉浸式体验设备

广州科普开放日来啦2023年9月广州科普开放日来啦,9月16日周六上午9点,广州卓远非常荣幸地迎来了一批前来体验的家庭。比原定的集合时间提前了近1个小时,已经开始有家长带着小朋友来到了VR科普基地,可见大家对VR科普体验的热情和兴趣之高。趣味VR科普,市民抢着报名!9月科普开放日活动共有131家国家级重点实验室、省级重

2023上半年薪资报告出炉!人均月入过万?!

最近,大家都有听到经济回暖的消息吧?经过三年口罩大考之后,2023年上半年各行各业都迎来复苏,关于职场的话题讨论也不绝于耳。现在就业环境如何?哪些行业更有前途?大家在求职时是选择一线城市还是回二、三线城市?……对于这一系列职场话题,近期猎聘发布的《2023上半年人才流动与薪酬趋势报告》中,列举了很多关于当前人才市场的趋

一台PoE交换机可以为多少个设备提供供电?

如今在安防监控领域,许多网络设备都支持PoE供电。在网络监控工程中,为了节省布线成本并提高便捷性,大多数工程商选择使用PoE供电方案,也就是使用PoE交换机为监控摄像头提供电力。那么,一台功率输出以太网(PoE)工业交换机能够为多少个设备提供电力呢?1、PoE交换机供电标准对于初次接触PoE供电的朋友来说,可能对PoE

使用Selenium进行网页登录和会话管理

随着互联网的快速发展,网页登录和会话管理是许多网站和应用程序的基本功能。通过网页登录,用户可以访问个人账户、购物车订单、历史记录等个性化信息。为了提高用户体验和效率,自动化登录和会话管理成为一个重要的需求。而Selenium作为一种强大的Web自动化工具,为开发人员提供了便捷的方式来实现这些功能。例如我们在访问京东网站

热文推荐