一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把MySQL重启,再Insert一条记录,这条记录的ID是18还是15?
题目背景不够清晰,表的存储引擎是InnoDB还是MyISAM,这么说的意义在于,自增列的信息在MyISAM和InnoDB中的维护逻辑是不大一样的,在MyISAM中是存储持久化在文件中的,当数据库重启之后,是可以通过持久化的信息持续对ID进行自增的,而InnoDB的自增列信息既不在.frm文件,也不在.ibd文件中,所以在此启动的时候会按照max(id)+1的算法进行修复。所以如果是MyISAM,则答案应该是18,而如果是InnoDB,则答案是15;
在MySQL 8.0之后,InnoDB的自增列信息写入了共享表空间中,所以服务重启之后,还是可以继续追溯这个自增列的ID变化情况的;
最终结论
在MySQL 8.0之前:
- 如果是MyISAM表,则数据库重启后,ID值为18
- 如果是InnoDB表,则数据库重启后,ID值为15
在MySQL 8.0及其之后:
- 如果是MyISAM表,则数据库重启后,ID值为18
- 如果是InnoDB表,则数据库重启后,ID值为18