1.mysql為什麼建議將自增列id設為主鍵?
綜上而言:當我們使用自增列作為主鍵時,訪問效率是最高的。
2.自增列id一定是連續的嗎?
自增id是增長的 不一定連續。
我們先來看下mysql 對自增值的儲存策略:
innodb 引擎的自增值,其實是儲存在了記憶體裡,並且到了 mysql 8.0 版本後,才有了「自增值持久化」的能力,也就是才實現了「如果發生重啟,表的自增值可以恢復為 mysql 重啟前的值」,具體情況是:造成自增id不連續的情況可能有:在 mysql 5.7 及之前的版本,自增值儲存在記憶體裡,並沒有持久化。每次重啟後,第一次開啟表的時候,都會去找自增值的最大值 max(id),然後將 max(id)+1 作為這個表當前的自增值。
舉例來說,如果乙個表當前資料行裡最大的 id 是 10,autoincrement=11。這時候,我們刪除 id=10 的行,autoincrement 還是 11。但如果馬上重啟例項,重啟後這個表的 auto_increment 就會變成 10。
也就是說,mysql 重啟可能會修改乙個表的 auto_increment 的值。
在 mysql 8.0 版本,將自增值的變更記錄在了 redo log 中,重啟的時候依靠 redo log 恢復重啟之前的值。
3.自增id有上限嗎?
自增id是整型字段,我們常用int型別來定義增長id,而int型別有上限 即增長id也是有上限的。
下表列舉下 int 與 bigint 字段型別的範圍:
型別大小
範圍(有符號)
範圍(無符號)
int4位元組 (-2147483648,2147483647)
(0,4294967295)
bigint 8位元組 (-9223372036854775808,9223372036854775807) (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);// 成功插入一行 4294967295show 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點建議:
mysql 實現id自增序列 mysql自增id列
如果希望在每次插入新記錄時,自動地建立主鍵欄位的值。可以在表中建立乙個 auto increment 字段。mysql 使用 auto increment 關鍵字來執行 auto increment 任務。預設地auto increment 的開始值是 1,每條新記錄遞增 1。主鍵又稱主關鍵字,主關...
mybaits返回自增主鍵ID
mybaits兩種獲取自增主鍵id的方法 一種是使用usegeneratedkeys,第二種是selectkey方法獲取。insert into sys users id,username,password,salt,locked values selectkey select last inser...
主鍵自增 修改序列 資料分析 SQL主鍵知識要點
在關係型資料庫中,一張表中的每一行資料被稱為一條記錄。一條記錄就是由多個字段組成的。對於關係表,有個很重要的約束,就是任意兩條記錄不能重複。不能重複不是指兩條記錄不完全相同,而是指能夠通過某個字段唯一區分出不同的記錄,這個字元被稱為主鍵。對於主鍵的要求,最關鍵的一點是 記錄一旦插入到表中,主鍵最好不...