• 项目记录:使用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-学生信息表

      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解决。

    表现层接口代码:

    1. @RestController //加入Bean 使用REST风格 响应数据
    2. @RequestMapping("/students")
    3. public class StudentInfoController {
    4. @Autowired
    5. private StudentInfoService stuService;
    6. @PostMapping(produces = "application/json;charset=UTF-8")
    7. public Result AddStudentInfo(@RequestBody StudentInfo studentInfo){ //自动将前端json数据转为我们自定的实体类对象
    8. boolean save = stuService.save(studentInfo);
    9. Result r = new Result(true,"添加成功"); //前后端数据联调(自定义Result类)
    10. return r;
    11. }
    12. }

    PostMan测试

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

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

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

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

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

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

     

    说明:

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

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

    PostMan页面:

     发送请求报错:

     不管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),单独设置字段的输入策略。

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. public class LoginInfo {
    5. /**
    6. * 学生学号
    7. */
    8. @TableId(type = IdType.INPUT)
    9. private Integer id;
    10. /**
    11. * 登录密码
    12. */
    13. @TableField(select = false)
    14. private String password;
    15. }

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

  • 相关阅读:
    接口自动化测试-断言机制哪家强 首推RestAssured 断言
    什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?
    大学毕业1年,从监工转行软件测试,我拿到了人生第一份8k的offer
    PCL 生成空间三角形面点云
    数据结构-作业8
    C语言-atof函数介绍
    建模的常用手段:组合和聚合
    Python【验证大于九点数与九的联系】
    测试员容易陷入的9大误区
    02设计模式——单例模式
  • 原文地址:https://blog.csdn.net/m0_60155232/article/details/128004831