MySQL自增ID,居然大部分人都搞錯了!?
《 MySQL刪除資料的三種方式 》中的作業題,99%的人答錯,有點出乎意料。
畫外音:評論中不乏嘲笑知識點簡單的小夥伴。
今天簡單說下作業題中的答案,以及知識點。
作業題是這樣的:
實驗步驟如上圖:
第一步:建表,設定自增列;
第二步:指定id=1插入,錨定第一行是id是1;
第三步:不指定id,依賴自增機制,插入3行;
畫外音: 此時id應該變為2,3,4了?
第四步:delete刪除所有記錄;
畫外音: 坑就容易出在這裡。
第五步:指定id=0插入;
第六步:指定id=1插入;
第七步:不指定id,依賴自增機制,插入1行;
請問,此時表中的三行記錄,id分別是多少?
知識點一: delete資料後,自增列計數 不會 從頭開始。
畫外音:truncate資料後,自增列計數會從頭開始。
因此,在第四步delete刪除所有 4條記錄 後,自增列計數,並不會重新歸0,也就是說,下一條insert的記錄, 自增列的值會是5 。
知識點二:含自增列的表,插入時可以手動指定自增列的值,但不能與已有值衝突,也可以使用系統預設自增列的值。
因此,第五、六、七步都是允許的:
insert (0, '000')
insert (1, '111')
insert ('222')
知識點三:如果手動指定自增列的值是0或者NULL,MySQL會視為無效,並使用系統預設自增列的值。
也就是說,第五步
insert (0, '000') 又或者 insert (NULL, '000')
都會被MySQL視為:
insert ('000')
即,實際插入到表中的記錄是
(5, '000')
第六步
insert (1, '111')沒有問題
實際插入的也是
(1, '111')
知識點四:如果使用系統預設自增列的值,會從當前最大值開始往後增加。
也就是說,第七步
insert ('222'),會使用預設值6,而不是2。
實際插入的是
(6, '222')
故,實驗結果,最終的三行記錄是:
5 ,000
1 ,111
6 ,222
你答對了嗎?
為了鞏固下上面的知識點,咱們一起來複習一下:
drop table t1;
create table t1(
id int not null
auto_increment,
name varchar(10)
unique,
count int default 0,
primary key(id),
index(name)
)engine=innodb;
insert into t1(id, name) values(
1 , " shenjian");
insert into t1(id, name) values( 111 , "111"),( NULL , "abc"),( 222 , "222"),( NULL ,"xyz");
請問,執行結束後id分別是多少呢?
答案:
(1, 'shenjian')
(111, '111') // 允許指定值
(112, 'abc') // 忽略NULL,從最大值開始增
(222, '222') // 允許指定值
(223, 'xyz') // 忽略NULL,從最大值開始增
上題如果 繼續執行以下語句:
"),("aaa"),("bbb")
on duplicate key update count=100;
請問:
(1)會不會執行報錯?
(2)如果報錯,為什麼呢?
(3)如果不報錯,得到的資料是什麼呢?
回答正確,並解釋清楚原因,可以送書喲。
知其然,更知其底層所以然。
關注“架構師之路”,下期揭曉答案。
架構師之路 -分享技術思路
相關文章 :
《 架構師之路,21年乾貨精選 》
- 如何使用動態規劃求解最長公共子串
- Android 架構師之路17 AOP 面向切面程式設計
- 架構師之路,從「儲存選型」起步
- MySQL自增ID,居然大部分人都搞錯了!?
- MySQL到底支不支援雜湊索引?(收藏)
- 突然掉電,為啥MySQL也不會丟失資料?(收藏)
- MySQL寫緩衝(change buffer),終於懂了!!!(收藏)
- MySQL緩衝池(buffer pool),終於懂了!!!(收藏)
- 當今微服務盛行之架構師必經之路-領域驅動設計-下
- 讀擴散,寫擴散,終於終於講清楚了!
- 快取,原來我們一直都用錯了!
- 送你九年經驗,我的Java學習之路你也可以複製
- 老闆問我,什麼是關聯規則推薦?
- PM架構師之路《重新出發》
- 老闆問我,完全沒有使用者歷史行為記錄,怎麼做推薦?
- 架構師之路-redis叢集解析
- 讓一線勞動者,更有尊嚴的工作
- 架構師之路-https底層原理
- 【架構師之路】二、軟體設計原則
- Android 架構師之路22 響應式程式設計RxJava 整體變換