目录
说明
外键列设置后自增失效特性演示
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解决。
表现层接口代码:
@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测试
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),单独设置字段的输入策略。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginInfo {
/**
* 学生学号
*/
@TableId(type = IdType.INPUT)
private Integer id;
/**
* 登录密码
*/
@TableField(select = false)
private String password;
}
设置后,未设置外键的字段ID可以使用表自增的策略,而设置有外键的ID字段,也可以实现ID的显示赋值,报错解决。