有時(shí)候會(huì)碰到一種奇怪的問(wèn)題,就是自增長(zhǎng)的字段,刪除之后,新添加的記錄有時(shí)連續(xù),有時(shí)不連續(xù)的情況。
MySQL 的auto_increment
的值是被存放在內(nèi)存中的計(jì)數(shù)器累加出來(lái)的,當(dāng)我們重啟服務(wù)器,或者M(jìn)ySQL服務(wù)的時(shí)候,計(jì)數(shù)器都會(huì)丟失。這時(shí),當(dāng)我們執(zhí)行insert操作的時(shí)候,MySQL會(huì)默認(rèn)獲取到自增長(zhǎng)的最大值,類似于使用
SELECT MAX(sid) FROM student FOR UPDATE;
然后再+1
有一個(gè)如下表
選區(qū)_018.png
初始表
如果我們執(zhí)行刪除
sid=5
的操作
delete sid=5
然后執(zhí)行插入
insert操作
我們發(fā)現(xiàn)sid的值是6而不是5,這是因?yàn)樽约硬⒎鞘前凑兆侄蔚淖畲笾祦?lái)加的,而是根據(jù)內(nèi)存中的計(jì)數(shù)器算出來(lái)的。
現(xiàn)在,讓我們刪除
sid=6
的記錄
delete sid=6
然后重啟服務(wù)器,
service mysql restart
再次執(zhí)行插入操作
insert操作
自增長(zhǎng)又是連續(xù)的了,這是因?yàn)?,我們重啟mysql服務(wù)之后,計(jì)數(shù)器丟失,當(dāng)我們執(zhí)行
insert
操作的時(shí)候,MySQL又為我們重新創(chuàng)建了一個(gè)計(jì)數(shù)器,獲取自增長(zhǎng)最大值的方式,或許就是SELECT MAX(sid) FROM student FOR UPDATE;