关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题
Posted 二木成林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题相关的知识,希望对你有一定的参考价值。
异常
设置@TableId注解后,还是无法做到数据库的主键自增长。
原因
不清楚,解决方法也比较玄学。
解决
在数据库中将该表删除掉,重新创建表并赋予数据,当然实体类还是要在id字段上添加@TableId注解
还可以参考这位@TableId(value = “id“,type = IdType.AUTO) 设置后无效的解决办法的解决方式,也比较玄学。
思考
好吧,其实也不玄学,说下自己的思考。
我们创建表的时候,表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;"语句来修改自动递增这个字段,但是失败了,因为这个字段只能改为比当前值大的数,不能改为比当前值小的数。
所以我暂时只想到这种方法:删除表,重新创建表结构。
以上是关于关于MybatisPlus使用@TableId(value = “id“, type = IdType.AUTO)注解使主键id自增长无效的问题的主要内容,如果未能解决你的问题,请参考以下文章
[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic&&通过全局配置配置主键生成策略
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略
MyBatisPlus新版本SpringBoot集成MyBatisPlus主键生成策略