1. 程式人生 > 資料庫 >關於MySQL自增ID的一些小問題總結

關於MySQL自增ID的一些小問題總結

下面這幾個小問題都是基於 InnoDB 儲存引擎的。

1. ID最大的記錄刪除後,新插入的記錄ID是什麼

例如當前表中有ID為1,2,3三條記錄,把3刪除,新插入記錄的ID從哪兒開始?

答案: 從4開始。

實驗

建立表 tb0,ID自增:

create table tb0(id int unsigned auto_increment primary key);

插入3條記錄:

insert into tb0 values(null);

刪除ID為3的記錄:

delete from tb0 where id=3

檢視當前自增值:

show create table tb0;

# 結果
CREATE TABLE `tb0` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

自增ID為4,刪除ID最大的記錄並不影響自增ID的值。

2. MySQL 重啟後自增ID從哪兒開始

例如當前表中有ID為1,3三條記錄,把3刪除,重啟MySQL,新插入記錄的ID從哪兒開始?

很多人會認為從4開始,實際是從3開始。

因為InnoDB的自增值是記錄在記憶體的,不是記錄在資料檔案的。

重啟後,會把 當前最大ID + 1 作為起始值。

實驗

建立表 tb1,ID自增:

create table tb1(id int unsigned auto_increment primary key);

新增3條資料記錄:

insert into tb1 values(null);

刪除ID為3的記錄:

delete from tb1 where id=3

通過上一個問題,我們知道,此時自增ID值為4。

重啟MySQL。

檢視當前的自增值:

show create table tb1;

# 結果
CREATE TABLE `tb1` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

3. 手動插入ID後,下次插入時自增值是多少

例如當前的自增ID為4,新插入記錄時,手動指定ID為10,下次使用自增方式插入時,ID是 11。

ID自增值 = 當前最大ID + 1

在插入新記錄時,就已經計算得出了新的ID值

實驗

建立表 tb2,ID自增:

create table tb2(id int unsigned auto_increment primary key);

新增記錄:

insert into tb2 values(null);

手動指定ID:

insert into tb2 values(4294967000);

檢視當前的自增值:

show create table tb2;

# 結果
CREATE TABLE `tb2` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1

可以看到自增值變為 4294967001。

4. 自增值用完後怎麼辦

無符號 int 的最大值為 4294967295,自增值達到此值後,就不變了,新插入記錄時就會報錯:

Duplicate entry '4294967295' for key 'PRIMARY'

如果表記錄經常插入、刪除,即使表內記錄總量不是很大,ID也可能快速用完,這種情況可以需要使用 bigint。

int 取值範圍:

int 是 4 byte,首位用來表示符號

有符號的範圍:
從 - 至 - 1

(-2147483648 至 2147483647)

無符號的範圍:
0 至 - 1

(0 至 4294967295)

bigint 取值範圍:

int 是 8 byte

有符號的範圍:
從 - 至 - 1

(-9223372036854775808 至 9223372036854775807)

無符號的範圍:
0 至 - 1

(0 至 18446744073709551615)

小結

通過實驗可以發現InnoDB中自增ID的一些特性:

插入新記錄時,就會計算出新的自增值(最大ID+1),不管是使用自動ID,還是手動指定一個ID。

刪除最大ID值對自增ID值沒有影響,但MySQL重啟之後有影響,不會使用之前的自增ID值,而是使用最大ID+1,因為自增ID值是存在記憶體中,重啟後需

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。

要重新計算。
自增ID用完後就不變了。