關於Mysql自增id的這些你可能還不知道

2022-09-25 07:39:08 字數 2116 閱讀 1452

導讀:

在使用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 說明...