zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

【异常】MyBatis-Plus的Integer类型的字段id设置成 @TableId(type = IdType.AUTO),但是因数据库有脏数据导致无法自动生成ID,提示空指针

数据库mybatis异常自动数据 设置 类型 生成
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