最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL遞增主鍵不連續(xù)的四種場景問題及解決

 更新時間:2026年04月29日 09:34:38   作者:又旅行又開拓的繩匠..  
本文解釋了MySQL中auto_increment的原理和四種導致自增主鍵不連續(xù)的情況:自增初始值和步長設(shè)置不為默認、唯一鍵沖突、事物回滾、批量插入,每種情況都有詳細的解釋和具體示例,有助于理解MySQL中的自增主鍵機制

MySQL中可以設(shè)置auto_increment,作用是新增數(shù)據(jù)時不需要手動添加主鍵,輸入null或未指定值時就會把auto_increment的值賦給自增主鍵。

一般來說,自增主鍵都是連續(xù)的,但是,有四個場景自增主鍵不是連續(xù)的!(使用的是InnoDB引擎)

第一種、自增初始值和自增步長設(shè)置不為 1

InnoDB引擎有兩個屬性:auto_increment_offset(初始值)和auto_increment_increment(步長),一般默認為1,即初始值1,每次自增1,所以子增值就是1,2,3,4,5...這就是連續(xù)的.

如果設(shè)置這兩個屬性,自增值就會從初始值開始,每次加一次步長得到下一個數(shù),比如設(shè)置初始值為3,步長為2,那自增值就是3,5,7,9...這就不是連續(xù)的了.

第二種、唯一鍵沖突

插入數(shù)據(jù)時,如果有設(shè)置唯一的字段重復了,那么就會報錯,插入失敗,但此時系統(tǒng)的自增值還是會增加一次,這是由于insert語句的執(zhí)行流程導致的:

  • 1.執(zhí)行器調(diào)用引擎準備插入數(shù)據(jù)(null,1,1)
  • 2.發(fā)現(xiàn)沒有主鍵值,獲取自增值2(表里已經(jīng)有數(shù)據(jù)1,1,1,假設(shè)第二個字段重復)
  • 3.將插入的數(shù)據(jù)改成(2,1,1)
  • 4.自增值變?yōu)?
  • 5.執(zhí)行插入操作,第二個字段重復,報 Duplicate key error,插入失敗

這個流程說明自增是在執(zhí)行插入數(shù)據(jù)之前,所以哪怕語句失敗了,自增值還是會自增,這時候再插入數(shù)據(jù)就會變成(3,2,1)了

第三種、事物回滾

MySQL里有個rollback,它是TCL語句,叫事務控制語句,比如commit和rollback,前者是提交,后者是回滾,作用是撤銷當前事務中已經(jīng)進行的所有修改,使數(shù)據(jù)庫返回到事務開始之前的狀態(tài)!

當我們執(zhí)行了插入操作后,自增值會增加,此時我們回滾,數(shù)據(jù)會回到插入之前的數(shù)據(jù),但自增值不會跟著回到之前的自增值,這么設(shè)計的原因是為了提高性能.

因為如果此時有多個并行執(zhí)行的事務(并行執(zhí)行時會加鎖),而回滾也會回滾自增值的話,就可能會導致主鍵重復沖突.為了解決這種沖突,要么就是判斷賦值自增值時表里是否已經(jīng)有此自增值,要么把鎖的范圍擴大到一個事務執(zhí)行完并提交,無論是哪種方法,都會影響性能,所以才會設(shè)計自增值不會回滾。

第四種、批量插入

對于批量插入的數(shù)據(jù),MySQL有一個批量申請自增的策略:

  • 第一次申請自增時,會分配1個值
  • 第二次時,會分配2個值
  • 第三次時,會分配4個值
  • ...

以此類推,同一個語句申請自增時,每次申請的個數(shù)都是上一次的兩倍

(這里說的批量插入不是insert into table values(),這類語句是可以精準計算出需要多少自增值的,不知道需要多少自增值的語句是insert...select、replace … select 和 load data)

舉個例子

有5個數(shù)據(jù)需要插入,(1,1),(2,2),(3,3),(4,4),(5,5)

  • 第一次申請,申請一個id:1
  • 第二次,申請兩個id:2,3
  • 第三次,申請四個id:4,5,6,7

此時自增值就變成了8,下次插入數(shù)據(jù)時就會把8賦值給主鍵!

總結(jié)

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

相關(guān)文章

  • MySQL ClickHouse常用表引擎超詳細講解

    MySQL ClickHouse常用表引擎超詳細講解

    這篇文章主要介紹了MySQL ClickHouse常用表引擎,ClickHouse表引擎中,CollapsingMergeTree和VersionedCollapsingMergeTree都能通過標記位按規(guī)則折疊數(shù)據(jù),從而達到更新和刪除的效果
    2022-11-11
  • MYSQL必知必會讀書筆記第五章之排序檢索數(shù)據(jù)

    MYSQL必知必會讀書筆記第五章之排序檢索數(shù)據(jù)

    本文給大家分享mysql必會必知讀書筆記第五章之排序檢索數(shù)據(jù),小編認為非常具有參考價值,特此分享到腳本之家平臺供大家參考
    2016-05-05
  • MySQL導出sql腳本文件操作指南

    MySQL導出sql腳本文件操作指南

    mysql數(shù)據(jù)庫是非常常用的一種數(shù)據(jù)庫,屬于中小型數(shù)據(jù)庫,常用于網(wǎng)站業(yè)務和一些WEB系統(tǒng)業(yè)務,下面這篇文章主要給大家介紹了關(guān)于MySQL導出sql腳本文件操作的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • phpstudy無法啟動MySQL服務的完美解決辦法

    phpstudy無法啟動MySQL服務的完美解決辦法

    學習php當然是要先安裝好運行環(huán)境了,phpstyudy是一個運行php的集成環(huán)境,一鍵安裝對新手很友好,下面這篇文章主要給大家介紹了關(guān)于phpstudy無法啟動MySQL服務的完美解決辦法,需要的朋友可以參考下
    2022-06-06
  • MySQL中查詢當前時間間隔前1天的數(shù)據(jù)

    MySQL中查詢當前時間間隔前1天的數(shù)據(jù)

    實際項目中我們都會遇到分布式定時任務執(zhí)行的情況,今天通過本文給大家分享MySQL中查詢當前時間間隔前1天的數(shù)據(jù),查詢sql語句給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧<BR>
    2021-12-12
  • MySql下關(guān)于時間范圍的between查詢方式

    MySql下關(guān)于時間范圍的between查詢方式

    這篇文章主要介紹了MySql下關(guān)于時間范圍的between查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mysql的MHA高可用及故障切換問題小結(jié)

    Mysql的MHA高可用及故障切換問題小結(jié)

    MHA是基于MySQL主從復制的高可用解決方案,通過自動切換到從節(jié)點并提升其為新主,實現(xiàn)數(shù)據(jù)庫的高可用和故障恢復,配置包括主從復制、MHA組件、VIP管理等,通過配置無密碼認證和測試連接,可以確保MHA正常運行,感興趣的朋友一起看看吧
    2024-12-12
  • MySQL執(zhí)行SQL文件報錯:Unknown collation ‘utf8mb4_0900_ai_ci‘的解決方案

    MySQL執(zhí)行SQL文件報錯:Unknown collation ‘utf8mb4_0900_ai_

    這篇文章主要給大家分享了MySQL執(zhí)行SQL文件出現(xiàn)【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解決方案,如果又遇到相同問題的同學,可以參考閱讀本文
    2023-09-09
  • MySQL在Windows中net start mysql 啟動MySQL服務報錯 發(fā)生系統(tǒng)錯誤解決方案

    MySQL在Windows中net start mysql 啟動MySQL服務報錯 發(fā)生系統(tǒng)錯誤解決方案

    這篇文章主要介紹了MySQL在Windows中net start mysql 啟動MySQL服務報錯 發(fā)生系統(tǒng)錯誤解決方案,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解標準mysql(x64) Windows版安裝過程

    詳解標準mysql(x64) Windows版安裝過程

    這篇文章主要介紹了標準mysql(x64) Windows版安裝過程,需要的朋友可以參考下
    2017-08-08

最新評論

连州市| 本溪市| 富锦市| 安泽县| 斗六市| 五峰| 赤壁市| 綦江县| 合川市| 承德县| 呈贡县| 城口县| 南阳市| 永新县| 平顶山市| 库车县| 会同县| 阿鲁科尔沁旗| 安泽县| 濮阳市| 寿阳县| 南丰县| 故城县| 临沂市| 城市| 陈巴尔虎旗| 尚义县| 马鞍山市| 隆林| 德令哈市| 通道| 四子王旗| 湖州市| 包头市| 西盟| 安西县| 蒙城县| 莲花县| 柳州市| 绩溪县| 麟游县|