首頁常見問題正文

MySQL自增主鍵為什么不是連續(xù)的?

更新時(shí)間:2023-05-30 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  MySQL的自增主鍵(Auto Increment)并不一定是連續(xù)的,這是由于MySQL的實(shí)現(xiàn)方式以及一些特殊情況所導(dǎo)致的。

  下面是一個(gè)簡單的代碼演示,展示了MySQL自增主鍵可能不是連續(xù)的情況:

-- 創(chuàng)建一個(gè)示例表
CREATE TABLE example (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50)
);

-- 插入一些數(shù)據(jù)
INSERT INTO example (name) VALUES ('John');
INSERT INTO example (name) VALUES ('Jane');

-- 查看插入后的數(shù)據(jù)
SELECT * FROM example;

  輸出結(jié)果可能如下所示:

+----+------+
| id | name |
+----+------+
| 1  | John |
| 2  | Jane |
+----+------+

  可以看到,自增主鍵的值分別為1和2,沒有出現(xiàn)斷層,是連續(xù)的。但在一些特殊情況下,自增主鍵可能不是連續(xù)的。下面是一些可能導(dǎo)致不連續(xù)的情況:

  1.刪除記錄:

  如果從表中刪除了一些行,自增主鍵的值不會(huì)重新填補(bǔ)已刪除的空缺,而是保持原樣。例如,刪除id為1的行后,下一次插入的記錄的主鍵值將為3,而不是2。

-- 刪除id為1的行
DELETE FROM example WHERE id = 1;

-- 插入一條新的記錄
INSERT INTO example (name) VALUES ('Bob');

-- 查看插入后的數(shù)據(jù)
SELECT * FROM example;

  輸出結(jié)果:

+----+------+
| id | name |
+----+------+
| 2  | Jane |
| 3  | Bob  |
+----+------+

  2.事務(wù)回滾:

  如果在一個(gè)事務(wù)中插入了一條記錄,但事務(wù)回滾了,該記錄的自增主鍵值也會(huì)被跳過,不會(huì)繼續(xù)使用。

-- 開啟事務(wù)
START TRANSACTION;

-- 插入一條記錄
INSERT INTO example (name) VALUES ('Alice');

-- 回滾事務(wù)
ROLLBACK;

-- 插入一條新的記錄
INSERT INTO example (name) VALUES ('Charlie');

-- 查看插入后的數(shù)據(jù)
SELECT * FROM example;

  輸出結(jié)果:

+----+--------+
| id |  name  |
+----+--------+
| 2  |  Jane  |
| 4  | Charlie|
+----+--------+

  可以看到,因?yàn)槭聞?wù)回滾了,id為3的記錄被跳過,下一次插入的記錄的主鍵值為4。

  這些情況都導(dǎo)致了自增主鍵的間斷,使其不是連續(xù)的。雖然自增主鍵的設(shè)計(jì)初衷是為了保證唯一性和簡化數(shù)據(jù)訪問,但并不保證連續(xù)性。如果需要連續(xù)的自增主鍵,可以考慮使用其他的方式或算法來生成主鍵值。

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!