★★★建議星標我們★★★
Java進階架構師★「星標」!這樣才不會錯過每日進階架構文章呀。
2020年Java原創面試題庫連載中
【000期】Java最全面試題庫思維導圖
【020期】JavaSE系列面試題匯總(共18篇)
【028期】JavaWeb系列面試題匯總(共10篇)
【042期】JavaEE系列面試題匯總(共13篇)
【049期】資料庫系列面試題匯總(共6篇)
【053期】中間件系列面試題匯總(共3篇)
【065期】數據結構與算法面試題匯總(共11篇)
【076期】分布式面試題匯總(共10篇)
【077期】綜合面試題系列(一)
【078期】綜合面試題系列(二)
【079期】綜合面試題系列(三)
【080期】綜合面試題系列(四)
【081期】綜合面試題系列(五)
【082期】綜合面試題系列(六)
【083期】綜合面試題系列(七)
【084期】綜合面試題系列(八)
【085期】綜合面試題系列(九)
【086期】綜合面試題系列(十)
【087期】綜合面試題系列(十一)
【088期】綜合面試題系列(十二)
【089期】綜合面試題系列(十三)
更多內容,點擊上面藍字查看
既然這塊知識點不清楚,那回頭就自己動手實踐下。
首先,創建一個最簡單的表,只包含一個自增 id,並插入一條數據。
create table t0(id int unsigned auto\_increment primary key) ;insert into t0 values;
通過 show 命令 show create table t0;
查看表情況
CREATE TABLE \`t0\` ( \`id\` int(10) unsigned NOT AUTO\_INCREMENT, PRIMARY KEY (\`id\`)) ENGINE=InnoDB AUTO\_INCREMENT=2 DEFAULT CHARSET=utf8
可以發現 AUTO_INCREMENT 已經自動變成 2,這離用完還有很遠,我們可以算下最大當前聲明的自增 ID 最大是多少,由於這裡定義的是 intunsigned
,所以最大可以達到 2 的 32 冪次方 - 1 = 4294967295
這裡有個小技巧,可以在創建表的時候,直接聲明 AUTO_INCREMENT 的初始值
create table t1(id int unsigned auto\_increment primary key) auto\_increment = 4294967295;insert into t1 values;
同樣,通過 show 命令,查看 t1 的表結構
CREATE TABLE \`t1\` ( \`id\` int(10) unsigned NOT AUTO\_INCREMENT, PRIMARY KEY (\`id\`)) ENGINE=InnoDB AUTO\_INCREMENT=4294967295 DEFAULT CHARSET=utf8
可以發現,AUTO_INCREMENT 已經變成 4294967295 了,當想再嘗試插入一條數據時,得到了下面的異常結果
17:28:03 insert into t1 values Error Code: 1062. Duplicate entry '4294967295' for key 'PRIMARY' 0.00054 sec
說明,當再次插入時,使用的自增 ID 還是 4294967295
,報主鍵衝突的錯誤。
4294967295,這個數字已經可以應付大部分的場景了,如果你的服務會經常性的插入和刪除數據的話,還是存在用完的風險,建議採用 bigint unsigned,這個數字就大了。
不過,還存在另一種情況,如果在創建表沒有顯示申明主鍵,會怎麼辦?
如果是這種情況,InnoDB 會自動幫你創建一個不可見的、長度為 6 字節的 row_id,而且 InnoDB 維護了一個全局的 dictsys.row_id,所以未定義主鍵的表都共享該 row_id,每次插入一條數據,都把全局 row_id 當成主鍵 id,然後全局 row_id 加 1
該全局 row_id 在代碼實現上使用的是 bigint unsigned 類型,但實際上只給 row_id 留了 6 字節,這種設計就會存在一個問題:如果全局 row_id 一直漲,一直漲,直到 2 的 48 冪次 - 1 時,這個時候再 + 1,row_id 的低 48 位都為 0,結果在插入新一行數據時,拿到的 row_id 就為 0,存在主鍵衝突的可能性。
所以,為了避免這種隱患,每個表都需要定一個主鍵。
來源:程序猿面試指南
之前,給大家發過三份Java面試寶典,這次新增了一份,目前總共是四份面試寶典,相信在跳槽前一個月按照面試寶典準備準備,基本沒大問題。
《java面試寶典5.0》(初中級)
《350道Java面試題:整理自100+公司》(中高級)
《資深java面試寶典-視頻版》(資深)
《Java[BAT]面試必備》(資深)
分別適用於初中級,中高級,資深級工程師的面試複習。
內容包含java基礎、javaweb、mysql性能優化、JVM、鎖、百萬並發、消息隊列,高性能緩存、反射、Spring全家桶原理、微服務、Zookeeper、數據結構、限流熔斷降級等等。
看到這裡,證明有所收穫