欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL INSERT INTO SELECT時(shí)自增Id不連續(xù)問題及解決

 更新時(shí)間:2023年12月08日 16:10:19   作者:shyの同學(xué)  
這篇文章主要介紹了INSERT INTO SELECT時(shí)自增Id不連續(xù)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.問題

最近筆者接到一個(gè)新的開發(fā)需求:

將多張相同字段的MySQL數(shù)據(jù)表合并為一張,一聽我就樂了,這不就是幾行INSERT INTO SELECT FROM…的事兒嘛。

在痛快的執(zhí)行完準(zhǔn)備交付的時(shí)候,發(fā)現(xiàn)了一個(gè)問題:

\qquad 合并好的數(shù)據(jù)表中的id居然不是連續(xù)自增的,也就是說合并的幾張數(shù)據(jù)表中每兩張表的Id中間沒有續(xù)上。

合并前的數(shù)據(jù)是長這樣的

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

可以發(fā)現(xiàn)4下來就是8了,11下來是15

2.分析

通過仔細(xì)的研究之后發(fā)現(xiàn),對(duì)于批量插入數(shù)據(jù)語句,MySQL提供了批量申請自增id的策略:

  • 語句執(zhí)行過程中,第一次申請自增id,會(huì)分配1個(gè)(2的0次方)
  • 1個(gè)用完以后,這個(gè)語句第二次申請自增id,會(huì)分配2個(gè)(2的1次方)
  • 2個(gè)用完以后,還是這個(gè)語句,第三次申請自增id,會(huì)分配4個(gè)(2的2次方)

也就是說當(dāng)我執(zhí)行下面這條語句時(shí)(user01一共四條數(shù)據(jù))

INSERT INTO user (name, age) SELECT name, age from user01;
  • 第一次申請自增id會(huì)分配1個(gè),1 < 4
  • 第二次申請自增id會(huì)分配2個(gè),1+2 < 4
  • 第三次申請自增id會(huì)分配4個(gè),1+2+4 > 4,終止

此時(shí)1 + 2 + 4 = 7 > 4,申請自增id的操作就會(huì)停止。

因?yàn)橐呀?jīng)申請了7個(gè)id了,所以當(dāng)我們執(zhí)行第二條SQL語句時(shí),插入數(shù)據(jù)的id就會(huì)從8開始,此時(shí)AUTO_INCREMENT的值也會(huì)是8

3.解決方案

筆者采用的操作是在Navicat中修改自動(dòng)遞增的值來保證它的id連續(xù):

直接將自動(dòng)遞增的值刪除,然后保存

當(dāng)然,這個(gè)理論上是不能解決根本問題的。

4.結(jié)論

這么設(shè)計(jì)的主要原因是為了提升性能,所以自增id只保證是遞增的,但不保證是連續(xù)的!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論