项目场景:

关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题


问题描述

设置@TableId注解后,还是无法做到数据库的主键自增长。

原因分析:

不清楚,解决方法也比较玄学。


解决方案:

在数据库中将该表删除掉,重新创建表并赋予数据,当然实体类还是要在id字段上添加@TableId注解

思考:

好吧,其实也不玄学,说下自己的思考。
我们创建表的时候,表id字段是设置自动增长的,并且主键id也是正常的,如下(表中已有五条记录):
然后我们使用MybatisPlus的insert()方法来插入数据,我们第一次插入的时候是没有在id字段上添加@TableId注解,也就是说我们按照mybatisplus方式设置的主键值,是一个很大很大的数字。
执行该insert()方法后,我们可以在数据库表中看到自增id变成了个很大的值
查看表结构
此时我们肯定要查找资料,知道可以通过设置@TableId(type=IdType.AUTO)来让主键自动递增,于是我们这样做了
再度执行insert()方法来插入数据
欸,发现还是没有自动递增,我们期望的应该id是6,但事实上不是,那么真的自增没有生效吗?不是的,我们还是来看表的结构,发现"自动递增"这个字段的值就是刚才插入的id值加1。
也就是我们设置的自动递增生效了,但是由于第一次使用MybatisPlus的insert()方法插入导致自增id值变成很大的一个数,那么在表结构中"自动递增"这个字段的值也变成了很大的数加1,也就是下一个id的值。
我们插入主键自动增长也就是获取这个值,所以我们即使设置了@TableId注解,也失败了,因为"自动递增"字段已经变成了很大的数,那么下一次递增,也是在这个已有的数上加1。
而我所提供的解决方法就是重新构建表结构,那么"自动递增"这个字段的值又会恢复正常,而Java程序中使用了@TableId注解,也会插入成功。
也就是说我所提供的方法就是为了重置"自动递增"这个字段。
注意,我也视图直接通过修改这个字段或者使用"ALTER TABLE tb_user AUTO_INCREMENT=9;"语句来修改自动递增这个字段,但是失败了,因为这个字段只能改为比当前值大的数,不能改为比当前值小的数。
所以我暂时只想到这种方法:删除表,重新创建表结构。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐