MySQL自增ID,居然大部分人都搞錯了!?

語言: CN / TW / HK

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,從最大值開始增

上題如果 繼續執行以下語句:

insert  into t1(name)values(" shenjian

"),("aaa"),("bbb")

on duplicate key  update count=100;

請問:

(1)會不會執行報錯?

(2)如果報錯,為什麼呢?

(3)如果不報錯,得到的資料是什麼呢?

回答正確,並解釋清楚原因,可以送書喲。

知其然,更知其底層所以然。

關注“架構師之路”,下期揭曉答案。

架構師之路 -分享技術思路

相關文章

架構師之路,21年乾貨精選