国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

前情提要:

最近新接了一個需求,需要去創建兩張表,其中有一張表需要根據業務id和業務類型建立唯一索引,對數據唯一性進行約束。

因為涉及到業務嘛,表結構就進行縮略了

表結構示例如下:

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

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

編碼結束,自測結束,信心滿滿的找前端同學進行聯調。

因為聯調嘛,mock了很多同樣的business_id和bussiness_type的數據,結果到了數據庫,因為唯一索引的約束,報了一堆錯誤,插入都失敗了。

終于調整了一下mock數據,插入成功了。

但是發生了一個比較神奇的現象

wKgaombZS8uAP3YWAAWjhNZXIGk416.png

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

關于自增主鍵

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

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

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

1.MyISAM引擎的自增值保存在數據文件中

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

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

wKgaombZS82AQfL8AAIuOmenPaY302.png

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

自增主鍵不連續的情況

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

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

第二種不連續的情況就是我們在聯調中遇到的問題了

簡單來做個測試,目前數據就像一開始的圖一樣,id自增到了24,下一個插入的應該是25,那么執行一條sql

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

wKgZombZS8-AJA0AAAD8FU1x49g171.png

插入成功了一條數據,主鍵是連續自增的。

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

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

果然,執行sql 的時候報出異常:

wKgaombZS9CAOwk1AAEIK9mIHbg535.png

繼續執行一條正確的正常的sql,插入結果:

wKgZombZS9GAMw3yAAF4RL7KqZM690.png

主鍵還是連續自增的。這個發生錯誤為什么自增主鍵還是連續的呢。我們模擬一下之前聯調遇到的情況,插入一條 sql:

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

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

wKgZombZS9KAUqsUAAFR3CsCMEY955.png

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

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

wKgaombZS9OAAwLcAAG0qbhHNzs175.png

主鍵發生了"斷代",27的主鍵跑丟了...

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

wKgZombZS9SAUHeEAAUNZrjqSmE108.png

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

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 開發
    +關注

    關注

    0

    文章

    378

    瀏覽量

    42144
  • SQL
    SQL
    +關注

    關注

    1

    文章

    789

    瀏覽量

    46695
  • 編碼
    +關注

    關注

    6

    文章

    1039

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    光伏一次調頻設備/一次調頻裝置|光伏一次調頻涉網試驗/光伏電站一次調頻建設改造方案

    2025年以來能源局下發通知要求10KV以上的新能源廠站要具備一次調頻能力,并遞交涉網試驗報告。對于投資規模不大的工商業分布式光伏電站,又要面臨改造投資問題,壓力較大。如何選擇質優價廉的一次調頻產品
    的頭像 發表于 01-17 08:54 ?1185次閱讀
    光伏<b class='flag-5'>一次</b>調頻設備/<b class='flag-5'>一次</b>調頻裝置|光伏<b class='flag-5'>一次</b>調頻涉網試驗/光伏電站<b class='flag-5'>一次</b>調頻建設改造方案

    光伏一次調頻設備,光伏電站一次調頻建設改造方案

    地控制機組有功功率的增減,限制電網頻率變化,使電網頻率維持穩定的自動控制過程。當電網頻率升高時,一次調頻功能要求機組快速減少有功功率的輸出,反之,當電網頻率下降時,一次調頻裝置就會減少發電機組有功功率
    發表于 01-16 20:06

    一次消諧器對電力系統的核心貢獻

    一次消諧器(又稱 PT 一次消諧裝置)是安裝在電壓互感器一次側中性點與地之間的非線性電阻設備,主要應用于3-66kV 中性點不接地或經消弧線圈接地的壓配電網,對保障電力系統安全穩定運
    的頭像 發表于 01-07 06:40 ?334次閱讀
    <b class='flag-5'>一次</b>消諧器對電力系統的核心貢獻

    從軟件到硬件的轉場:場由OceanOS-CM0啟發的嵌入式思考

    材料,更是套思維訓練工具。它引導軟件開發者完成一次“著陸”——從虛擬的軟件世界,降落到具體的硬件現實。 在這個過程中,我們學到的不僅是如何點亮LED、如何配置串口、如何使用互斥鎖,更
    發表于 01-04 15:52

    開發過程中如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?

    開發過程中,如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?
    發表于 12-15 07:23

    SAA認證常見被拒原因分析:如何一次通過審核順利清關?

    設計不符合標準,最終導致認證被駁回或市場抽查不合格。本文結合2025年最新監管趨勢,深入剖析SAA認證過程中最常見的被拒原因,并提供針對性解決方案,助您一次通過審
    的頭像 發表于 11-24 10:46 ?785次閱讀
    SAA認證常見被拒原因分析:如何<b class='flag-5'>一次</b>通過審核順利清關?

    根線也能有“責任感”?HDMI線守護每一次重要放映

    體驗。而在這類“不容出錯”的場景,有根常被忽視的線纜,始終處于信號鏈路的最后環——HDMI線。 它沒有屏幕展示畫面,沒有揚聲器傳遞
    的頭像 發表于 10-20 17:50 ?612次閱讀

    開發指南】全志系列核心板開發過程中的常見問題及排查策略

    在長期提供技術支持服務的過程中,飛凌嵌入式總結了用戶開發全志系列產品時常見的問題及排查方法。本文中,小編將為大家梳理這些經驗,助力開發者快速定位問題,提升開發效率。
    的頭像 發表于 10-15 08:04 ?6870次閱讀
    【<b class='flag-5'>開發</b>指南】全志系列核心板<b class='flag-5'>開發過程中</b>的常見問題及排查策略

    UPS不間斷電源在放電過程中的注意事項

    UPS在日常的使用過程中,只有定期對UPS放電才能延長UPS的使用壽命,UPS 電源電池需要每三個月進行一次充放電,怎樣對UPS進行放電才能讓其保持在最佳工作狀態? 現在,由匯智天源工程師和大家聊
    的頭像 發表于 10-11 11:33 ?640次閱讀
    UPS不間斷電源在放電<b class='flag-5'>過程中</b>的注意事項

    濕法去膠第一次不干凈會怎么樣

    在半導體制造過程中,若濕法去膠第一次未能完全去除干凈,可能引發系列連鎖反應,對后續工藝和產品質量造成顯著影響。以下是具體后果及分析:殘留物導致后續工藝缺陷薄膜沉積異常:未清除的光刻膠殘留會作為異物
    的頭像 發表于 09-16 13:42 ?625次閱讀
    濕法去膠第<b class='flag-5'>一次</b><b class='flag-5'>去</b>不干凈會怎么樣

    芯片研發過程中的兩種流片方式

    芯片在研發過程中一般包含4個階段:芯片設計、生產樣片、測試驗證和大規模量產。在完成芯片設計后,工程師們需要先拿到些芯片樣片,用它們進行測試和驗證,來判斷新研發的芯片在功能和性能上是否符合設計要求
    的頭像 發表于 09-09 15:04 ?1927次閱讀
    芯片研<b class='flag-5'>發過程中</b>的兩種流片方式

    英語單詞學習頁面+單詞朗讀實現 -- 【2】單詞朗讀實現 ##HarmonyOS SDK AI##

    ? 注:我需要先強調下,我的目的不是把官網文檔里的東西復制遍……而是分享自己實際開發過程中遇到的問題和思考 仍然先放下效果圖 ? 這里
    發表于 06-29 23:26

    使用CY7C65213開發過程中,應該用哪個interface進行uart通信?

    在使用CY7C65213開發過程中,我想用CyUartRead讀數據,但是好像沒有接口的deviceType是CY_TYPE_UART,想請問我應該用哪個interface進行uart通信? 是否有相關指導文件,或描述符指導?
    發表于 06-03 07:04

    一次消諧裝置與二消諧裝置區別、一次消諧器與二消諧器的區別

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

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

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