问题现象
1.建表语句中设置id为自增id
create table aaa( id bigint unsigned auto_increment comment '自增id' primary key, type int default 0 not null comment '1.全部满足 2.任一满足', create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间', update_time timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', ) charset = utf8;
2.插入数据
直接全部使用默认值插入数据库
INSERT INTO aaa (type, create_time, update_time) VALUES ( DEFAULT, DEFAULT, DEFAULT);
3.数据库中查看数据
查看发现自增id直接来到了 1580089915291529217且从第八位后毫无规律
![在这里插入图片描述](https://img-blog.csdnimg.cn/451356914432461bbf7aa233de82e611.png
4.删除数据并把自增id设置为1,重新用代码插入数据
执行如下sql
delete from aaa;alter table aaa auto_increment = 1;
然后执行代码插入数据
查看数据库发现自增id依旧是随机数
5.分析原因
计算下这个id的长度,共19位,恰好是雪花算法id长度。mysql不可能自己生成雪花算法id,问题应该在mybatisplus上,对比下刚生成的代码和之前的代码,发现实体类主键上缺少如下注解
@TableId(value = "id", type = IdType.AUTO)
6.确认问题
为实体类主键加上注解
/** * 自增id */ @TableId(value = "id", type = IdType.AUTO) private Long id;
重置自增主键,执行如下sql
alter table aaa auto_increment = 1;
再次执行代码插入数据
发现数据已经正常
之后查看了mybatisplus主键策略枚举
public enum IdType { AUTO(0), NONE(1), INPUT(2), ASSIGN_ID(3), ASSIGN_UUID(4), /** @deprecated */ @Deprecated ID_WORKER(3), /** @deprecated */ @Deprecated ID_WORKER_STR(3), /** @deprecated */ @Deprecated UUID(4); private final int key; private IdType(int key) { this.key = key; } public int getKey() { return this.key; }}
其中 AUTO 是自增,不加注解mybatisplus会默认使用 ASSIGN_ID策略,即雪花算法。
自此真相大白
结论
mybatisplus自增主键要在实体主键上加如下注解
@TableId(value = "id", type = IdType.AUTO)