99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-05 14:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前情提要:

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

因?yàn)樯婕暗綐I(yè)務(wù)嘛,表結(jié)構(gòu)就進(jìn)行縮略了

表結(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 '刪除標(biāo)識(shí),0表示未刪除,1表示刪除', 
    `creator` varchar(50) NOT NULL COMMENT '創(chuàng)建人PIN', 
    `modify_date` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', 
    `create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間', 
     PRIMARY KEY (`id`), 
     UNIQUE KEY `uk_business_id_and_type` (`business_id`,`business_type`)
 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='示例表'

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

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

因?yàn)槁?lián)調(diào)嘛,mock了很多同樣的business_id和bussiness_type的數(shù)據(jù),結(jié)果到了數(shù)據(jù)庫,因?yàn)槲ㄒ凰饕募s束,報(bào)了一堆錯(cuò)誤,插入都失敗了。

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

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

wKgaombZS8uAP3YWAAWjhNZXIGk416.png

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

關(guān)于自增主鍵

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

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

不同的引擎對(duì)于自增值的保存策略不同

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

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

了解了自增主鍵的保存機(jī)制,再了解一下主鍵這個(gè)"自增"邏輯~

wKgaombZS82AQfL8AAIuOmenPaY302.png

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

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

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

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

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

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

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

wKgZombZS8-AJA0AAAD8FU1x49g171.png

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

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

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

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

wKgaombZS9CAOwk1AAEIK9mIHbg535.png

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

wKgZombZS9GAMw3yAAF4RL7KqZM690.png

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

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

因?yàn)閕d=26的數(shù)據(jù)buiness_id和bussiness_type 跟新插入的這條數(shù)據(jù)一樣,那么肯定會(huì)因?yàn)槲ㄒ凰饕迦氩怀晒?,果然,?zhí)行結(jié)果如下:

wKgZombZS9KAUqsUAAFR3CsCMEY955.png

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

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

wKgaombZS9OAAwLcAAG0qbhHNzs175.png

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

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

wKgZombZS9SAUHeEAAUNZrjqSmE108.png

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

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    373

    瀏覽量

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

    關(guān)注

    1

    文章

    783

    瀏覽量

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

    關(guān)注

    6

    文章

    968

    瀏覽量

    55758
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用CY7C65213開發(fā)過程中,應(yīng)該用哪個(gè)interface進(jìn)行uart通信?

    在使用CY7C65213開發(fā)過程中,我想用CyUartRead讀數(shù)據(jù),但是好像沒有接口的deviceType是CY_TYPE_UART,想請(qǐng)問我應(yīng)該用哪個(gè)interface進(jìn)行uart通信? 是否有相關(guān)指導(dǎo)文件,或描述符指導(dǎo)?
    發(fā)表于 06-03 07:04

    一次消諧裝置與二消諧裝置區(qū)別、一次消諧器與二消諧器的區(qū)別

    一次消諧器與二消諧器是電力系統(tǒng)中用于抑制諧振過電壓的不同裝置,主要區(qū)別如下: 安裝位置:一次消諧器串聯(lián)于電壓互感器(PT)一次側(cè)中性點(diǎn)與地之間,直接承受高電壓;二
    的頭像 發(fā)表于 05-07 09:58 ?1087次閱讀
    <b class='flag-5'>一次</b>消諧裝置與二<b class='flag-5'>次</b>消諧裝置區(qū)別、<b class='flag-5'>一次</b>消諧器與二<b class='flag-5'>次</b>消諧器的區(qū)別

    TIM2輸入捕獲,DMA開啟中斷傳輸輸入捕獲數(shù)據(jù),程序跑的過程中,DMA直中斷,TIM6只觸發(fā)一次中斷,怎么解決?

    用TIM2捕獲輸入的數(shù)據(jù),并且通過DMA存儲(chǔ),在開啟DMA中斷同時(shí),TIM6斷也開啟(用于計(jì)時(shí))。但是程序跑的過程中,DMA直中斷,TIM6只觸發(fā)一次中斷。
    發(fā)表于 03-14 06:39

    歐度MEDI-SNAP一次性醫(yī)用插頭發(fā)布

    歐度MEDI-SNAP一次性醫(yī)用插頭產(chǎn)品組加入新成員啦!為滿足一次性內(nèi)窺鏡、一次性手術(shù)消融刀等設(shè)備的耗材需求,歐度將ODU MEDI-SNAP一次
    的頭像 發(fā)表于 02-21 16:00 ?497次閱讀

    在linux下開發(fā)過程中, DLP4500 GUI無法連接光機(jī)怎么解決?

    在linux下開發(fā)過程中, DLP4500 GUI 無法連接光機(jī),出現(xiàn)錯(cuò)誤提示如下: open device_handle error: Is a directory opening path
    發(fā)表于 02-20 08:41

    如何在日常開發(fā)過程中提高代碼質(zhì)量

    。 提高代碼質(zhì)量是個(gè)系統(tǒng)工程,本文主要介紹開發(fā)人員如何在日常開發(fā)過程中提高代碼質(zhì)量。 01 什么是代碼質(zhì)量? 代碼質(zhì)量般用于衡量代碼的“好”和“爛”:“好”代碼表示代碼質(zhì)量高,“爛
    的頭像 發(fā)表于 01-23 09:09 ?564次閱讀
    如何在日常<b class='flag-5'>開發(fā)過程中</b>提高代碼質(zhì)量

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

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

    充分考慮設(shè)備的體驗(yàn)性易用性 藍(lán)鵬設(shè)計(jì)部將這理念貫穿于整個(gè)研發(fā)過程

    設(shè)計(jì)部還充分考慮設(shè)備的易用性。他們深知,個(gè)易于使用的設(shè)備能夠降低用戶的學(xué)習(xí)成本,提高用戶的使用效率。因此,在研發(fā)過程中,設(shè)計(jì)部注重從以下幾個(gè)方面提升設(shè)備的易用性: 1.簡(jiǎn)化操作流程:通過優(yōu)化設(shè)備
    發(fā)表于 12-24 14:07

    求助,關(guān)于LMK5B12204調(diào)試I2C過程中遇到的幾個(gè)問題求解

    目前在調(diào)試I2C過程中遇到如下幾個(gè)問題: 1)如果HW_SW_CTRL配置成1時(shí)(ROM+I2C模式),一次只讀取0x0C寄存器的值發(fā)現(xiàn)值是0x1b,如果讀取兩個(gè)或者兩個(gè)以上的寄存器值就發(fā)生錯(cuò)誤
    發(fā)表于 11-13 06:03

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

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

    一次電源與二電源有什么不同

    在電力系統(tǒng)和電子設(shè)備的供電領(lǐng)域中,一次電源與二電源是兩個(gè)至關(guān)重要的概念。它們各自承擔(dān)著不同的功能和角色,共同確保電力供應(yīng)的穩(wěn)定性和可靠性。本文將對(duì)一次電源與二電源的定義、區(qū)別以及它
    的頭像 發(fā)表于 10-10 14:10 ?5072次閱讀

    一次電池分類以及應(yīng)用場(chǎng)景詳解

    01 一次電池簡(jiǎn)介 一次電池即原電池(primarycell、primarybattery)(俗稱干電池),是放電后不能再充電使其復(fù)原的電池,通電電池有正極、負(fù)極電解以及容器和隔膜等組成。 一次電池
    的頭像 發(fā)表于 09-30 17:52 ?2741次閱讀
    <b class='flag-5'>一次</b>電池分類以及應(yīng)用場(chǎng)景詳解

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

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

    康謀分享 | 在基于場(chǎng)景的AD/ADAS驗(yàn)證過程中,識(shí)別挑戰(zhàn)性場(chǎng)景!

    基于場(chǎng)景的驗(yàn)證是AD/ADAS系統(tǒng)開發(fā)過程中的重要步驟,然而面對(duì)海量駕駛記錄數(shù)據(jù)時(shí),如何實(shí)現(xiàn)自動(dòng)且高效地識(shí)別、分類和提取駕駛記錄的挑戰(zhàn)性場(chǎng)景?本文康謀為您介紹IVEX軟件識(shí)別挑戰(zhàn)性場(chǎng)景并進(jìn)行數(shù)據(jù)分析的強(qiáng)大功能。
    的頭像 發(fā)表于 08-28 10:16 ?1426次閱讀
    康謀分享 | 在基于場(chǎng)景的AD/ADAS驗(yàn)證<b class='flag-5'>過程中</b>,識(shí)別挑戰(zhàn)性場(chǎng)景!

    電氣一次設(shè)備有哪些其功能是什么

    電氣一次設(shè)備是指那些直接參與電能的生產(chǎn)、轉(zhuǎn)換以及輸配過程的設(shè)備。這些設(shè)備在電力系統(tǒng)扮演著核心角色,確保電能從生產(chǎn)到消費(fèi)的各個(gè)環(huán)節(jié)能夠高效、安全地進(jìn)行。具體來說,電氣一次設(shè)備主要包括以
    的頭像 發(fā)表于 08-27 14:50 ?2181次閱讀