導讀:
在使用mysql建表時,我們通常www.cppcns.com會建立乙個自增字段(auto_increment),並以此字段作為主鍵。本篇文章將以問答的形式講述關於自增id的一切。
注: 本文所講的都是基於innodb儲存引擎。
下面話不多說了,來一起隨著小編看看詳細的介紹吧
1.mysql為什麼建議將自增列id設為主鍵?
綜上而言:當我們使用自增列作為主鍵時,訪問效率是最高的。
2.自增列id一定是連續的嗎?
自增id是增長的 不一定連續。
我們先來看下mysql 對自增值的儲存策略:
innodb 引擎的自增值,其實是儲存在了記憶體裡,並且到了 mysql 8.0 版本後,才有了「自增值持久化」的能力,也就是才實現了「如果發生重啟,表的自增值可以恢復為 mysql 重啟前的值」,具體情況是:
在 mysql 5.7 及之前的版本,自增值儲存在記憶體裡,並沒有持久化。每次重啟後,第一次開啟表的時候,都會去找自增值的最大值 max(id),然後將 max(id)+1 作為這個表當前的自增值。
舉例來說,如果乙個表當前資料行裡最大的 id 是 10,auto_increment=11。這時候,我們刪除 id=10 的行,auto_increment 還是 11。但如果馬上重啟例項,重啟後這個表的 auto_increment 就會變成 10。
也就是說,mysql 重啟可能會修改乙個表的 auto_increment 的值。
在 mysql 8.0 版本,將自增值的變更記錄在了 redo log 中,重啟的時候依靠 redo log 恢復重啟之前的值。
造成自增id不連續的情況可能有:
1.唯一鍵衝突
2.事務回滾
3.insert ... select語句批量申請自增id
3.自增id有上限嗎?
自增id是整型字段,我們常用int型別來定義增長id,而int型別有上限 即增長id也是有上限的。
下表列舉下 int 與 bigint 字段型別的範圍:
型別大小
範圍(有符號)
範圍(無符號)
int4位元組
(-2147483648,2147483647)
(0,4294967295)
bigint
8位元組(-9223372036854775808,92233720368程式設計客棧54775807)
(0,18446744073709551615)
從上表可以看出:當自增欄位使用int有符號型別時,最大可達2147483647即21億多;使用int無符號型別時,最大可達4294967295即42億多。當然bigint能表示的範圍更大。
下面我們測試下當自增id達到最大時再次插入資料會怎麼樣:
create table t(id int unsigned auto_increment primary key) auto_increment=4294967295;
insert into t values(null);
// 成功插入一行 4294967295
show create table t;
/* create table `t` (
`id` int(10) unsigned not null auto_increment,
primary key (`id`)
) engine=innodb auto_increment=4294967295;
*/insert into t values(null);
//duplicate entry '4294967295' for key 'primary'
從實驗可以看出,當自增id達到最大時將無法擴充套件,第乙個 insert 語句插入資料成功後,這個表的auto_increment 沒有改變(還是 4294967295),就導致了第二個 insert 語句又拿到相同的自增 id 值,再試圖執行插入語句,報主鍵衝突錯誤。
4.關於自增列 我們該怎麼維護?
維護方面主要提供以下2點建議:
1.欄位型別選擇方面:推薦使用int無符號型別,若可**該錶資料量將非常大 可改用bigint無符號型別。
2.多關注大表的自增值,防止發生主鍵溢位情況。
程式設計客棧總結
本文標題: 關於mysql自增id的這些你可能還不知道
本文位址:
mysql 實現id自增序列 mysql自增id列
如果希望在每次插入新記錄時,自動地建立主鍵欄位的值。可以在表中建立乙個 auto increment 字段。mysql 使用 auto increment 關鍵字來執行 auto increment 任務。預設地auto increment 的開始值是 1,每條新記錄遞增 1。主鍵又稱主關鍵字,主關...
關於自增ID的弊端
如果現在公司的資料庫 old db table1 有以下記錄 1 a2 b 3 c4 d 以上 1 4 是公司自用資料 a使用者新增一條記錄 e 即5 e 現在新的資料庫公司的new db table1 的資料要更新 1 a2 b 3 c4 d 5 l6 m 以上 1 6 是公司自用資料 那麼使用者...
mysql自增id重置
參考 使用truncate truncate table 說明 使用truncate會刪除表的資料釋放空間,並且重置字自增id,但不會刪除表的定義。用處 需要清空表的時候才能使用。使用修改標識 dbcc checkident table name reseed,new reseed value 說明...