自增不连续
表初始化
CREATE TABLE `t` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`c` INT(11) DEFAULT NULL,
`d` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB;```
## 自增值
```go
INSERT INTO t VALUES (null,1,1);
-- AUTO_INCREMENT=2,表示下一次插入数据时,如果需要自动生成自增值,会生成id=2
mysql> SHOW CREATE TABLE t;
+-------+---------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------+
| t | CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `c` (`c`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------+
保存策略
- MyISAM引擎的自增值是保存在数据文件
- InnoDB引擎的自增值,是保存在内存里,到了MySQL 8.0,才有自增值持久化的能力
- MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化:
- 每次重启后,第一次打开表时,都会去找自增值的最大值max(id)
- 然后将max(id)+1作为这个表当前的自增值
- 假如一个表当前数据行的最大id为10,AUTO_INCREMENT=11
- 此时,删除id=10的行,AUTO_INCREMENT依然还是11
- 如果马上重启实例,重启后这个表的AUTO_INCREMENT就会变成10
- 即MySQL重启后可能会修改一个表的AUTO_INCREMENT值