關(guān)于MySQL自增ID的一些小問題總結(jié)
下面這幾個小問題都是基于 InnoDB 存儲引擎的。
1. ID最大的記錄刪除后,新插入的記錄ID是什么
例如當前表中有ID為1,2,3三條記錄,把3刪除,新插入記錄的ID從哪兒開始?
答案: 從4開始。
實驗
創(chuàng)建表 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; # 結(jié)果 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,2,3三條記錄,把3刪除,重啟MySQL,新插入記錄的ID從哪兒開始?
很多人會認為從4開始,實際是從3開始。
因為InnoDB的自增值是記錄在內(nèi)存的,不是記錄在數(shù)據(jù)文件的。
重啟后,會把 當前最大ID + 1 作為起始值。
實驗
創(chuàng)建表 tb1,ID自增:
create table tb1(id int unsigned auto_increment primary key);
添加3條數(shù)據(jù)記錄:
insert into tb1 values(null);
刪除ID為3的記錄:
delete from tb1 where id=3
通過上一個問題,我們知道,此時自增ID值為4。
重啟MySQL。
查看當前的自增值:
show create table tb1; # 結(jié)果 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
在插入新記錄時,就已經(jīng)計算得出了新的ID值
實驗
創(chuàng)建表 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; # 結(jié)果 CREATE TABLE `tb2` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1
可以看到自增值變?yōu)?4294967001。
4. 自增值用完后怎么辦
無符號 int 的最大值為 4294967295,自增值達到此值后,就不變了,新插入記錄時就會報錯:
Duplicate entry '4294967295' for key 'PRIMARY'
如果表記錄經(jīng)常插入、刪除,即使表內(nèi)記錄總量不是很大,ID也可能快速用完,這種情況可以需要使用 bigint。
int 取值范圍:
int 是 4 byte,首位用來表示符號
有符號的范圍:
從 - 至 - 1(-2147483648 至 2147483647)
無符號的范圍:
0 至 - 1(0 至 4294967295)
bigint 取值范圍:
int 是 8 byte
有符號的范圍:
從 - 至 - 1(-9223372036854775808 至 9223372036854775807)
無符號的范圍:
0 至 - 1(0 至 18446744073709551615)
小結(jié)
通過實驗可以發(fā)現(xiàn)InnoDB中自增ID的一些特性:
插入新記錄時,就會計算出新的自增值(最大ID+1),不管是使用自動ID,還是手動指定一個ID。
刪除最大ID值對自增ID值沒有影響,但MySQL重啟之后有影響,不會使用之前的自增ID值,而是使用最大ID+1,因為自增ID值是存在內(nèi)存中,重啟后需要重新計算。
自增ID用完后就不變了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關(guān)文章
Mysql?InnoDB?的內(nèi)存結(jié)構(gòu)詳情
這篇文章主要介紹了Mysql InnoDB的內(nèi)存結(jié)構(gòu)詳情,InnoDB存儲引擎的邏輯存儲結(jié)構(gòu)是什么呢,下面我們就一起進入文章了解更多詳細內(nèi)容吧,感興趣的小伙伴可以參考一下2022-05-05Mysql?innoDB修改自增id起始數(shù)的方法步驟
本文主要介紹了Mysql?innoDB修改自增id起始數(shù)的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>2023-03-03MySQL數(shù)據(jù)庫 Load Data 多種用法
這篇文章主要介紹MySQL數(shù)據(jù)庫中 Load Data 數(shù)據(jù)的幾種種用法,需要的朋友可以參考下面文章的解說2021-08-08Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報錯的解決方法
這篇文章主要介紹了Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報錯的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實現(xiàn)
這篇文章主要介紹了MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-02-02