那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

自增主鍵去哪了?---一次開發(fā)過程中的思考

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-05 14:12 ? 次閱讀

前情提要:

最近新接了一個需求,需要去創(chuàng)建兩張表,其中有一張表需要根據(jù)業(yè)務(wù)id和業(yè)務(wù)類型建立唯一索引,對數(shù)據(jù)唯一性進行約束。

因為涉及到業(yè)務(wù)嘛,表結(jié)構(gòu)就進行縮略了

表結(jié)構(gòu)示例如下:

CREATE TABLE `example_table` ( 
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵', 
    `business_id` bigint(20) unsigned NOT NULL COMMENT '業(yè)務(wù)ID', 
    `business_type` tinyint(3) unsigned NOT NULL COMMENT '業(yè)務(wù)類型,', 
    `del` tinyint(1) unsigned DEFAULT '0' COMMENT '刪除標識,0表示未刪除,1表示刪除', 
    `creator` varchar(50) NOT NULL COMMENT '創(chuàng)建人PIN', 
    `modify_date` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', 
    `create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', 
     PRIMARY KEY (`id`), 
     UNIQUE KEY `uk_business_id_and_type` (`business_id`,`business_type`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='示例表'

既然表建立好,那么就是發(fā)揮我們編碼能力的時候了...此處省略一堆編碼時間。

編碼結(jié)束,自測結(jié)束,信心滿滿的找前端同學(xué)進行聯(lián)調(diào)。

因為聯(lián)調(diào)嘛,mock了很多同樣的business_id和bussiness_type的數(shù)據(jù),結(jié)果到了數(shù)據(jù)庫,因為唯一索引的約束,報了一堆錯誤,插入都失敗了。

終于調(diào)整了一下mock數(shù)據(jù),插入成功了。

但是發(fā)生了一個比較神奇的現(xiàn)象

wKgaombZS8uAP3YWAAWjhNZXIGk416.png

主鍵不是連續(xù)自增的了~~ 中間丟失的自增主鍵去哪了??

關(guān)于自增主鍵

自增主鍵是我們在設(shè)計數(shù)據(jù)庫表結(jié)構(gòu)時經(jīng)常使用的主鍵生成策略,主鍵的生成可以完全依賴數(shù)據(jù)庫,在新增數(shù)據(jù)的時候,我們只需要將主鍵設(shè)置為null,0或者不設(shè)置該字段,數(shù)據(jù)庫就會為我們自動生成一個主鍵值。

首先,我們要知道 自增主鍵保存在哪里~

不同的引擎對于自增值的保存策略不同

1.MyISAM引擎的自增值保存在數(shù)據(jù)文件中

2.InnoDB引擎的自增值,在MySQL5.7及之前的版本,自增值保存在內(nèi)存里,并沒有持久化。每次重啟后,第一次打開表的時候,都會去找自增值的最大值max(id),然后將max(id)+步長(建表語句中的指定步長)作為這個表當(dāng)前的自增值。在MySQL8.0版本,將自增值的變更記錄在了redo log中,重啟的時候依靠redo log恢復(fù)重啟之前的值。

了解了自增主鍵的保存機制,再了解一下主鍵這個"自增"邏輯~

wKgaombZS82AQfL8AAIuOmenPaY302.png

插入一條語句分配自增主鍵id值的流程如圖所示。

自增主鍵不連續(xù)的情況

細心的小伙伴一定發(fā)現(xiàn)了~咦,這個ID=聲明值的話,ID就可以能被隨意指定了,那么ID就可能存在不是自增的情況了!

是的,這其實就是第一種自增主鍵不連續(xù)的情況。

第二種不連續(xù)的情況就是我們在聯(lián)調(diào)中遇到的問題了

簡單來做個測試,目前數(shù)據(jù)就像一開始的圖一樣,id自增到了24,下一個插入的應(yīng)該是25,那么執(zhí)行一條sql

insert into example_table  values (null,111,1,0,'mock',now(),now());

wKgZombZS8-AJA0AAAD8FU1x49g171.png

插入成功了一條數(shù)據(jù),主鍵是連續(xù)自增的。

那么我們模擬一條錯誤的sql呢(`creator`字段指定錯類型)~:

insert into example_table  values (null,112,1,0,mock,now(),now());

果然,執(zhí)行sql 的時候報出異常:

wKgaombZS9CAOwk1AAEIK9mIHbg535.png

繼續(xù)執(zhí)行一條正確的正常的sql,插入結(jié)果:

wKgZombZS9GAMw3yAAF4RL7KqZM690.png

主鍵還是連續(xù)自增的。這個發(fā)生錯誤為什么自增主鍵還是連續(xù)的呢。我們模擬一下之前聯(lián)調(diào)遇到的情況,插入一條 sql:

insert into example_table  values (null,112,1,0,'mock',now(),now());

因為id=26的數(shù)據(jù)buiness_id和bussiness_type 跟新插入的這條數(shù)據(jù)一樣,那么肯定會因為唯一索引插入不成功,果然,執(zhí)行結(jié)果如下:

wKgZombZS9KAUqsUAAFR3CsCMEY955.png

那么,我們修改一下sql繼續(xù)插入呢?

insert into example_table  values (null,113,1,0,'mock',now(),now())

wKgaombZS9OAAwLcAAG0qbhHNzs175.png

主鍵發(fā)生了"斷代",27的主鍵跑丟了...

明明都是sql插入的時候錯誤,為什么結(jié)果會有差異呢,有的時候主鍵會丟失,有的時候主鍵不會丟失呢,想要弄明白這個問題,就需要先明白一下一條sql的執(zhí)行過程:

wKgZombZS9SAUHeEAAUNZrjqSmE108.png

這里只是針對本文需要關(guān)注的點(相信小伙伴對這個執(zhí)行過程肯定也是非常了解的

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    370

    瀏覽量

    40920
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    775

    瀏覽量

    44254
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    957

    瀏覽量

    54954
收藏 人收藏

    評論

    相關(guān)推薦

    調(diào)試ADS1278,讀取數(shù)據(jù)過程中在下一次SYNC低脈沖信號前出現(xiàn)反復(fù)進入中斷的現(xiàn)象,請問是否正確?

    準備檢索變?yōu)榈停铱刂圃贒RDY下降沿進入中斷讀取數(shù)據(jù)(僅讀取通道1),但是讀取數(shù)據(jù)過程中在下一次SYNC低脈沖信號前出現(xiàn)反復(fù)進入中斷的現(xiàn)象,請問是否正確?在時序上還有什么問題嗎? 黃色SCLK波形
    發(fā)表于 12-25 07:03

    自己做的TAS5825板子軟件開發(fā)過程中怎么接到PPC3上去調(diào)試呢?

    我們打算做個TAS5825的板子,PPC3軟件已經(jīng)申請下來了,有個問題是我們自己做的TAS5825板子軟件開發(fā)過程中怎么接到PPC3上去調(diào)試呢?
    發(fā)表于 10-15 08:15

    ODU MEDI-SNAP一次性醫(yī)用插拔鎖插頭產(chǎn)品介紹

    為滿足一次性內(nèi)窺鏡、一次性手術(shù)消融刀等設(shè)備的耗材需求,歐度全新推出了MEDI-SNAP一次性醫(yī)用插拔鎖插頭,為醫(yī)療客戶打造
    的頭像 發(fā)表于 09-10 09:59 ?507次閱讀

    記錄一次使用easypoi時與源碼博弈的過程

    、背景介紹 最近剛剛接手保險線之聲平臺的開發(fā)和維護工作,第個需要修復(fù)的問題是:平臺的事件導(dǎo)出成excel功能在經(jīng)過
    的頭像 發(fā)表于 07-03 16:33 ?402次閱讀
    記錄<b class='flag-5'>一次</b>使用easypoi時與源碼博弈的<b class='flag-5'>過程</b>

    鴻蒙OS開發(fā):典型頁面場景【一次開發(fā),多端部署】(資源使用)

    在頁面開發(fā)過程中,經(jīng)常需要用到顏色、字體、間距、圖片等資源,在不同的設(shè)備或配置,這些資源的值可能不同。
    的頭像 發(fā)表于 05-28 09:44 ?1041次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:典型頁面場景【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】(資源使用)

    鴻蒙OS開發(fā):典型頁面場景【一次開發(fā),多端部署】實戰(zhàn)(設(shè)置典型頁面)

    本示例展示設(shè)置應(yīng)用的典型頁面,其在小窗口和大窗口有不同的顯示效果,體現(xiàn)一次開發(fā)、多端部署的能力。
    的頭像 發(fā)表于 05-27 09:36 ?1245次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:典型頁面場景【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】實戰(zhàn)(設(shè)置典型頁面)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(視頻應(yīng)用)

    者提供一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用
    的頭像 發(fā)表于 05-25 16:29 ?4615次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】(視頻應(yīng)用)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(音樂專輯頁面)

    基于自適應(yīng)和響應(yīng)式布局,實現(xiàn)一次開發(fā)、多端部署音樂專輯頁面。
    的頭像 發(fā)表于 05-25 16:21 ?883次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】(音樂專輯頁面)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】應(yīng)用(資源使用)

    在頁面開發(fā)過程中,經(jīng)常需要用到顏色、字體、間距、圖片等資源,在不同的設(shè)備或配置,這些資源的值可能不同。
    的頭像 發(fā)表于 05-21 15:43 ?1107次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】應(yīng)用(資源使用)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】( 設(shè)置app頁面)

    本示例展示設(shè)置應(yīng)用的典型頁面,其在小窗口和大窗口有不同的顯示效果,體現(xiàn)一次開發(fā)、多端部署的能力。
    的頭像 發(fā)表于 05-21 14:56 ?1283次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】( 設(shè)置app頁面)

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(天氣應(yīng)用)案例

    本章通過個天氣應(yīng)用,介紹多應(yīng)用的整體開發(fā)過程,包括UX設(shè)計、工程管理及調(diào)試、頁面開發(fā)等。
    的頭像 發(fā)表于 05-15 15:42 ?1137次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】(天氣應(yīng)用)案例

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署-音樂專輯】

    基于自適應(yīng)和響應(yīng)式布局,實現(xiàn)一次開發(fā)、多端部署音樂專輯頁面。
    的頭像 發(fā)表于 05-13 16:48 ?749次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署-音樂專輯】

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署(視頻應(yīng)用)】

    者提供一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用
    的頭像 發(fā)表于 05-11 15:41 ?1568次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署(視頻應(yīng)用)】

    FPGA開發(fā)過程中配置全局時鐘需要注意哪些問題

    在FPGA開發(fā)過程中,配置全局時鐘是個至關(guān)重要的步驟,它直接影響到整個系統(tǒng)的時序和性能。以下是配置全局時鐘時需要注意的些關(guān)鍵問題: 時鐘抖動和延遲 :全局時鐘資源的設(shè)計目標是實現(xiàn)最低的時鐘抖動
    發(fā)表于 04-28 09:43

    基波是一次諧波么 基波與一次諧波的區(qū)別

    的頻率決定整個波形的基本特征,其他諧波成分則是基波頻率的整數(shù)倍。 一次諧波是指頻率為基波頻率的整數(shù)倍的諧波分量。在諧波分析,所有的頻率為基波頻率的整數(shù)倍的諧波分量都被稱為一次諧波。
    的頭像 發(fā)表于 04-08 17:11 ?8294次閱讀
    娱乐城注册送现金58| 大发888熊之舞怎么玩 | 顶级赌场371betcwm| 许昌市| 百家乐官网单机版游戏下载| 筹码百家乐官网的玩法技巧和规则| 做生意适合放什么花招财| 百家乐任你博娱乐网| 大发888娱乐游戏外挂| 太阳城亚洲开户| 百家乐官网塑料扑克牌盒| 百家乐打水策略| 皇家百家乐的玩法技巧和规则| 欢乐谷娱乐城开户| 永利百家乐官网游戏| 网络百家乐官网现金游戏哪里的信誉好啊 | 百家乐视频一下| 免费百家乐过滤软件| 缅甸黄金赌场| 在线百家乐官网| 百家乐官网德州扑克发牌盒| 同花顺百家乐的玩法技巧和规则 | 洛南县| 大集汇百家乐官网的玩法技巧和规则 | 永利博百家乐的玩法技巧和规则| 注册娱乐城送体验金| 百家乐官网鞋业| 新世纪百家乐娱乐城| 一二博| 澳门百家乐官网先赢后输| 百家乐园胎教网| 大发888娱乐城大奖| 百家乐官网编单短信接收| 百家乐交流群号| 亲朋棋牌手机版下载| 百家乐官网园sun811| 二代百家乐破解| 犍为县| 百家乐路单打法| 大发888娱乐城888 bg| 百家乐马宝|