MySQL5.7之auto_increment回溯

梓沐發表於2019-09-26

# 建立關於表t,其中a欄位為主鍵自增
mysql> create table t(a bigint primary key auto_increment, b tinyint);
Query OK, 0 rows affected (0.03 sec)

# 插入一些資料
mysql> insert into t select null, 10;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> insert into t select null, 20;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> insert into t select null, 30;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql> insert into t select null, 40;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

# 檢視錶記錄
mysql> select * from t;
+---+------+
| a | b    |
+---+------+
| 1 |   10 |
| 2 |   20 |
| 3 |   30 |
| 4 |   40 |
+---+------+
4 rows in set (0.00 sec)

# 刪除最後一條資料
mysql> delete from t where a=4;
Query OK, 1 row affected (0.02 sec)

# 檢視錶建立語句,發現AUTO_INCREMENT=5
mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` bigint(20) NOT NULL AUTO_INCREMENT,
  `b` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

# 進行主鍵回溯模擬
# 重啟資料庫
[root@mysql ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!

# 重新檢視錶建立語句,發現AUTO_INCREMENT=4
mysql> show create table t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` bigint(20) NOT NULL AUTO_INCREMENT,
  `b` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

# 繼續插入語句
mysql> insert into t select null, 50;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

# 檢視錶的資料,發現上述自增ID=4又重新出現
mysql> select * from t;
+---+------+
| a | b    |
+---+------+
| 1 |   10 |
| 2 |   20 |
| 3 |   30 |
| |   50 |
+---+------+
4 rows in set (0.00 sec)
這是因為在MySQL5.7中的表的AUTO_INCREMENT是基於記憶體,不會持久化在磁碟中,每次啟動資料庫時,會對每張表進行max(auto_increment) + 1重新作為該表下一次的主鍵ID的自增值。在MySQL8.0中就不會出現該問題,因為資料會在磁碟中持久化。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29812844/viewspace-2658344/,如需轉載,請註明出處,否則將追究法律責任。

相關文章