【异常】MyBatis-Plus的Integer类型的字段id设置成 @TableId(type = IdType.AUTO),但是因数据库有脏数据导致无法自动生成ID,提示空指针
2023-09-14 09:04:55 时间
一、报错截图
数据库中有一条脏数据时候,无法正常执行自增操作。
二、报错说明
2.1 检查相关的内容
2.1.1 实体内容
定义为如下的@TableId(type = IdType.AUTO)
@Getter
@Setter
@TableName(value = "app_scenarios_config", autoResultMap = true)
public class ScenariosConfig extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Integer id;
//使用率阈值
private int utilization;
//0-已经失效 1-已经启用'
private String status;
}
2.1.2 插入语句的Service 中的内容
代码中没有给ID赋值,按照Mybatis的文档说明,是会自动生成ID内容的
@Override
public Boolean updateConfigData(ScenariosConfig dto) {
ScenariosConfig config = new ScenariosConfig();
config.setUtilization(dto.getUtilization());
config.setStatus("1");
config.setCreateBy(LoginHelper.getUsername());
config.setCreateTime(new Date());
return baseMapper.insert(config) > 0;
}
2.1.3 Mapper映射的内容
ID是正确定义的
<resultMap id="scenariosConfigMap" type="路径名.entity.ScenariosConfig">
<id property="id" column="id"/>
<result property="utilization" column="utilization"/>
<result property="status" column="status"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="remark" column="remark"/>
</resultMap>
2.1.4 数据库中的字段说明
定义了bigint(20)的 字段id,并且设置为了从1950904841这个值开始自增
2.2 原因分析
造成这个问题的原因可能是我在没有设置 @TableId(type = IdType.AUTO)
注解的情况下,
直接在数据库中用SQL直接插入了一条记录,
也就是这一条记录,导致了异常
三、报错解决
将MySQL记录的自增值重置一下,并且删除之前插入的那条脏数据
再在mysql数据库中执行:ALTER TABLE 库名.表名 AUTO_INCREMENT = 0;
ALTER TABLE app_scenarios_config AUTO_INCREMENT = 0;
重新测试
重置之后的自增值就会从已有数据中主键值最大的那条数据开始计算+1。
四、MySQL自增的解释
4.1 自增列从1开始,每个新行增加1
在MySQL中,自增特性用于为列生成唯一和连续的值。
自增列通常用作主键,以唯一标识表中的每一行。
默认情况下,自增列从1开始,每个新行增加1。
4.2 可以指定不同的起始值和增量值
但是,可以指定不同的起始值和增量值。
对于特定的1、3、5序列,很可能自增列被设置为从1开始,每个新行增加2。
这将导致1、3、5、7等序列。
在代码库中检查表定义。查找自增列并检查其起始值和增量值。
4.3 创建具有自增列的表的示例
以下是创建具有自增列的表的示例,该列从1开始,每个新行增加2:
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
) AUTO_INCREMENT=1
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
在此示例中,id列是自增列,它从1开始,每个新行增加2。
五、参考文章
【异常】MyBatis-Plus因@TableId错误使用,导致主键未生成,SQL异常提示SQLException: Field ‘xxx‘ doesn‘t have a default value
相关文章
- 数据库的存储过程_数据库的存储过程语句
- MyBatis——【第二章】mybatis动态sql(分页)
- MyBatis框架:第五章:源码解析及Mapper接口方式的mybatis的增,删,改,查实现
- 一篇文章带你掌握主流数据库框架——MyBatis
- MyBatis-Plus 快速开始及详测 SpringBoot 集成Mybatis-Plus
- 基于SpringBoot+Mybatis框架的私人影院预约系统(附源码,包含数据库文件)
- MyBatis-Plus联表查询(Mybatis-Plus-Join)
- Mybatis-Plus动态表名插件实现数据库分表查询
- Specified key was too long; max key length is 767 bytes详解数据库
- Mybatis where 1=1 和 标签详解数据库
- SpringBoot连接MySql数据库集成Mybatis详解编程语言
- 设置坚持不懈:Redis主从数据库密码设置(redis主从密码)
- MySQL Status Mysqlx_stmt_drop_collection 数据库状态作用意思及如何正确
- MySQL Status Prepared_stmt_count 数据库状态作用意思及如何正确
- MyBatis配置文件(mybatis-config.xml)
- XML与Oracle:一种强大的数据库组合(xmloracle)
- 数据库MySQL数据库之旅:入门指引(进入mysql)
- 精通Oracle数据库触发器类型(oracle触发器类型)
- 学习Oracle入门指南,快速掌握数据库知识(怎么学习oracle)
- MongoDB与MGO:完美的数据库解决方案(mongodbmgo)
- MySQL图形用户界面(GUI)下载:简化数据库管理(mysqlgui下载)
- 探究Oracle数据库中的统计值及其作用(oracle统计值)
- MyBatis与Oracle存储过程互通:简化开发,提高效率(mybatis调用oracle存储过程)
- MSSQL语句定义:有效解决数据库处理问题(mssql 语句 定义)
- 深入了解:访问MSSQL数据库的方法(访问mssql数据库)
- Oracle禁用并行查询实现数据库性能最优化(oracle关闭并行查询)
- Oracle数据库实现单字段获取技术(oracle先取一个字段)
- 简易搭建Mybatis连接Oracle数据库(mybatis连接oracle)
- DOS环境下实现Oracle数据库链接的探索(dos oracle链接)
- 解锁Oracle数据库LGWR进程之路(oracle中lgwr)
- PHP中数据库单例模式的实现代码分享