MySQL INSERT INTO SELECT時(shí)自增Id不連續(xù)問(wèn)題及解決
1.問(wèn)題
最近筆者接到一個(gè)新的開(kāi)發(fā)需求:
將多張相同字段的MySQL數(shù)據(jù)表合并為一張,一聽(tīng)我就樂(lè)了,這不就是幾行INSERT INTO SELECT FROM…的事兒嘛。
在痛快的執(zhí)行完準(zhǔn)備交付的時(shí)候,發(fā)現(xiàn)了一個(gè)問(wèn)題:
\qquad 合并好的數(shù)據(jù)表中的id居然不是連續(xù)自增的,也就是說(shuō)合并的幾張數(shù)據(jù)表中每?jī)蓮埍淼腎d中間沒(méi)有續(xù)上。
合并前的數(shù)據(jù)是長(zhǎng)這樣的

合并好之后的數(shù)據(jù)是長(zhǎng)這樣的

可以發(fā)現(xiàn)4下來(lái)就是8了,11下來(lái)是15
2.分析
通過(guò)仔細(xì)的研究之后發(fā)現(xiàn),對(duì)于批量插入數(shù)據(jù)語(yǔ)句,MySQL提供了批量申請(qǐng)自增id的策略:
- 語(yǔ)句執(zhí)行過(guò)程中,第一次申請(qǐng)自增id,會(huì)分配1個(gè)(2的0次方)
- 1個(gè)用完以后,這個(gè)語(yǔ)句第二次申請(qǐng)自增id,會(huì)分配2個(gè)(2的1次方)
- 2個(gè)用完以后,還是這個(gè)語(yǔ)句,第三次申請(qǐng)自增id,會(huì)分配4個(gè)(2的2次方)
也就是說(shuō)當(dāng)我執(zhí)行下面這條語(yǔ)句時(shí)(user01一共四條數(shù)據(jù))
INSERT INTO user (name, age) SELECT name, age from user01;
- 第一次申請(qǐng)自增id會(huì)分配1個(gè),1 < 4
- 第二次申請(qǐng)自增id會(huì)分配2個(gè),1+2 < 4
- 第三次申請(qǐng)自增id會(huì)分配4個(gè),1+2+4 > 4,終止
此時(shí)1 + 2 + 4 = 7 > 4,申請(qǐng)自增id的操作就會(huì)停止。
因?yàn)橐呀?jīng)申請(qǐng)了7個(gè)id了,所以當(dāng)我們執(zhí)行第二條SQL語(yǔ)句時(shí),插入數(shù)據(jù)的id就會(huì)從8開(kāi)始,此時(shí)AUTO_INCREMENT的值也會(huì)是8
3.解決方案
筆者采用的操作是在Navicat中修改自動(dòng)遞增的值來(lái)保證它的id連續(xù):
直接將自動(dòng)遞增的值刪除,然后保存

當(dāng)然,這個(gè)理論上是不能解決根本問(wèn)題的。
4.結(jié)論
這么設(shè)計(jì)的主要原因是為了提升性能,所以自增id只保證是遞增的,但不保證是連續(xù)的!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在JPA項(xiàng)目啟動(dòng)時(shí)如何新增MySQL字段
這篇文章主要介紹了在JPA項(xiàng)目啟動(dòng)時(shí)新增MySQL字段,本來(lái)用了JPA,直接實(shí)體類加參數(shù)就可以新增字段了,但是架不住垃圾項(xiàng)目在啟動(dòng)項(xiàng)目時(shí)會(huì)加載數(shù)據(jù)庫(kù)SQL文件去插入數(shù)據(jù),需要一些操作幫助修復(fù),需要的朋友可以參考下2024-06-06
MySQL 分表分庫(kù)怎么進(jìn)行數(shù)據(jù)切分
這篇文章主要介紹了MySQL 分表分庫(kù)怎么進(jìn)行數(shù)據(jù)切分,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-03-03
解決MySQL5.7安裝后沒(méi)有data文件夾無(wú)法登錄的問(wèn)題
這篇文章主要介紹了解決MySQL5.7安裝后沒(méi)有data文件夾無(wú)法登錄的問(wèn)題,需要的朋友可以參考下2016-04-04
深入解析MySQL的事務(wù)隔離及其對(duì)性能產(chǎn)生的影響
這篇文章主要介紹了MySQL的事務(wù)隔離及其對(duì)性能產(chǎn)生的影響,在MySQL的優(yōu)化方面具有一定的借鑒意義,需要的朋友可以參考下2015-12-12
詳解Mysql自動(dòng)備份與恢復(fù)的幾種方法(圖文教程)
本篇文章主要介紹了Mysql 自動(dòng)備份與恢復(fù),主要有三種方法,有需要的可以了解一下。2016-11-11
MySQL如何通過(guò)Navicat實(shí)現(xiàn)遠(yuǎn)程連接
這篇文章主要介紹了MySQL如何通過(guò)Navicat實(shí)現(xiàn)遠(yuǎn)程連接,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-09-09

