项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)

目录

说明

外键列设置后自增失效特性演示

ID不设置自增策略,报错问题和解决

设置自增策略冲突问题和解决。


说明

记录在使用SpringBoot + MyBatisPlus操作数据库以及和前端页面交互时遇到的问题和解决方式。

1.表主键字段设置外键之后,自增功能失效问题。

2.PostMan测试传入json数据后台接收时报错argument type mismatch解决。

3.yml文件配置ID自增策略为auto后导致表外键自增列添加失败问题解决。

外键列设置后自增失效特性演示

现有表 tab_student_info 和表 tab_login_info,两个表的字段

tab_student_info-学生信息表

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_第1张图片

  tab_login_info-登录信息表

登录信息表的ID设置外键映射学生信息表的ID。

给登录信息表添加记录,ID字段设置为null,查看ID是否会自增。

INSERT INTO tab_login_info VALUES(NULL,'123456')

执行该SQL语句,会报如下错误:

1452 - Cannot add or update a child row: a foreign key constraint fails (`xingshang`.`tab_login_info`, CONSTRAINT `fk_logininfo_stuinfo_id` FOREIGN KEY (`id`) REFERENCES `tab_student_info` (`id`))

大概意思就是:该条记录无法添加或更新,因为存在外键约束。

因此就只能在添加记录时,显示的声明ID了,如下:

INSERT INTO tab_login_info VALUES(7,'123456')

 添加成功: Affected rows: 1

ID不设置自增策略,报错问题和解决

用SpringBoot+MyBatisPlus 在写好表现层接口后,使用PostMan测试接口的新增记录方法:save()

获取PostMan传入的对应实体类的json数据,报错:argument type mismatch解决。

表现层接口代码:

@RestController   //加入Bean 使用REST风格 响应数据
@RequestMapping("/students")
public class StudentInfoController {

    @Autowired
    private StudentInfoService stuService;

    @PostMapping(produces = "application/json;charset=UTF-8")
    public Result AddStudentInfo(@RequestBody StudentInfo studentInfo){ //自动将前端json数据转为我们自定的实体类对象
        boolean save = stuService.save(studentInfo);
        Result r = new Result(true,"添加成功"); //前后端数据联调(自定义Result类)
        return r;
    }
}

PostMan测试

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_第2张图片

 PostMan发送请求之后,报错:argument type mismatch (ERROR 23828)

翻译来说是:参数类型不匹配,指向是(StudentInfoController.java:25),一看是save()报错,

开始以为是save()参数有问题,检查save()的参数要求为StudentInfo对象,打印来看(@RequestBody StudentInfo studentInfo)中接收的参数也是会自己转为StudentInfo对象。

并不是这个问题,思考是否是StudentInfo类中字段类型问题。

解决:yml配置文件设置ID自增策略后解决报错。

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_第3张图片

设置自增策略后添加成功。 

 项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_第4张图片

说明:

虽然这个表现层添加了,但是我们测试一下login表对应的表现层,结果是会报错的。

因为login表的ID存在外键约束,此博客的最上方已经说明了外键约束后ID自增会失效的问题,设置了外键约束的ID主键列只能显示的输入ID进行记录的添加。

PostMan页面:

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_第5张图片

 发送请求报错:

 不管ID是null还是指定ID,都会报错:

java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails......

报错解决方案如下  

设置自增策略冲突问题和解决。

上方报错,报错信息是外键约束导致报错,因为我们想设置ID自增,在yml文件中设置了

id-type: auto,配置文件范围是全局的。导致我们设置了外键的login表ID字段添加记录时报错,所以思路就是全局ID还是使用自增策略,设置了外键的字段设置为用户自定义输入策略即可。

实际解决方式

在外键属性添加注解:@TableId(type = IdType.INPUT),单独设置字段的输入策略。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginInfo {

    /**
     * 学生学号
     */
    @TableId(type = IdType.INPUT)
    private Integer id;

    /**
     * 登录密码
     */
    @TableField(select = false)
    private String password;

}

设置后,未设置外键的字段ID可以使用表自增的策略,而设置有外键的ID字段,也可以实现ID的显示赋值,报错解决。

你可能感兴趣的:(框架,项目记录,mysql,spring,boot,MybatisPlus)