在MySQL8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primay key)+1,在mysql重启后,会重置AUTO_INCREMENT=max(primay key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。
MySQL5.7数据测试
创建测试表:
mysql> create table t2(id int(10) auto_increment primary key,name varchar(30));
Query OK, 0 rows affected (0.06 sec)
插入测试数据:
mysql> insert into t2(name) values('lisa');
Query OK, 1 row affected (0.06 sec)
mysql> insert into t2(name) values('susan');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t2(name) values('liumei');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t2(name) values('wangwu');
Query OK, 1 row affected (0.05 sec)
mysql> select * from t2;
+----+--------+
| id | name |
+----+--------+
| 1 | lisa |
| 2 | susan |
| 3 | liumei |
| 4 | wangwu |
+----+--------+
4 rows in set (0.00 sec)
删除部分数据:
mysql> delete from t2 where name in ('susan','liumei','wangwu');
Query OK, 3 rows affected (0.05 sec)
重启数据库库,然后插入数据:
mysql> insert into t2(name) values('linda');
Query OK, 1 row affected (0.04 sec)
mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | lisa |
| 2 | linda |
+----+-------+
2 rows in set (0.00 sec)
查看表结构:
mysql> show create table t2;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看到测试表t2的自增主键值变成了3。数据库重启之前的自增值已经不见了,这种情况在高并发系统出现宕机重启后,可能造成数据冲突。
MySQL8.0 数据测试
mysql> create table t2(id int(10) auto_increment primary key,name varchar(30));
Query OK, 0 rows affected, 1 warning (0.10 sec)
mysql> insert into t2(name) values('linda');
Query OK, 1 row affected (0.08 sec)
mysql> insert into t2(name) values('kangkang');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t2(name) values('haiwen');
Query OK, 1 row affected (0.05 sec)
mysql> delete from t2 where name in('haiwen','kangkang');
Query OK, 2 rows affected (0.04 sec)
mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | linda |
+----+-------+
1 row in set (0.00 sec)
重启数据库,并插入数据:
mysql> insert into t2(name) values('lilei');
Query OK, 1 row affected (0.04 sec)
mysql> insert into t2(name) values('houli');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+----+-------+
| id | name |
+----+-------+
| 1 | linda |
| 4 | lilei |
| 5 | houli |
+----+-------+
3 rows in set (0.00 sec)
查看表结构:
show create table t2;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
可以看到自增主键值已经变成了6,没有受数据库重启而受到影响,自增主键值实现了持久化。