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

MySQL8自增主鍵變化圖文詳解

 更新時(shí)間:2022年04月18日 08:16:14   作者:濤姐濤哥  
眾所周知MySQL 的主鍵可以是自增的,下面這篇文章主要給大家介紹了關(guān)于MySQL8自增主鍵變化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、簡(jiǎn)述

MySQL版本從5直接大躍進(jìn)到8,相信MySQL8一定會(huì)有很多令人意想不到的改進(jìn),如果不想只會(huì)CRUD可以看看。

比如系統(tǒng)表引擎的變化-全部換成事務(wù)型的InnoDB。

MySQL5.7系統(tǒng)部引擎

MySQL8系統(tǒng)引擎

上圖可以看到,MySQL5.7的系統(tǒng)表引擎有MEMORY、InnnoDB和MyISAM三種,但MySQL8的系統(tǒng)表引擎都換成了InnoDB。MySQL8新特性還有很多,接下來(lái)進(jìn)入正題康康它的自增主鍵。

二、MySQL自增主鍵

為什么MySQL8新特性會(huì)修改自增主鍵屬性?

在MySQL8.0之前,自增主鍵 AUTO_INCREMENT 的值如果大于max(primary key) +1,那么在MySQL重啟后,則會(huì)重置 AUTO_INCREMENT = max(primary key)+1 的值,這種現(xiàn)象在某些情況下會(huì)導(dǎo)致業(yè)務(wù)主鍵沖突或者其他難以發(fā)現(xiàn)的一些問(wèn)題。

MySQL官網(wǎng)解釋自增ID沖突問(wèn)題

因?yàn)樵贛ySQL5.7中,對(duì)于自增主鍵的分配規(guī)則是由InnoDB數(shù)據(jù)字典內(nèi)部一個(gè)計(jì)數(shù)器來(lái)決定的,而該計(jì)數(shù)器維護(hù)在了內(nèi)存中,并不會(huì)持久化到磁盤(pán)中,此時(shí)硬盤(pán)中并無(wú)數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)重啟的時(shí)候,該計(jì)數(shù)器會(huì)被初始化為: auto_increment = max(primary key)+1。

如何解決自增主鍵沖突問(wèn)題?

這個(gè)問(wèn)題一直到MySQL8.0才解決。

8.0版本將會(huì)對(duì) AUTO_INCREMENT 值進(jìn)行持久化,所以即使MySQL重啟后該值也不會(huì)改變。

即其將自增主鍵的計(jì)數(shù)器持久化到了重做日志中,每次計(jì)數(shù)器發(fā)生改變都會(huì)將其寫(xiě)入到重做日志中,如果這個(gè)時(shí)候數(shù)據(jù)庫(kù)重啟了,那么InnoDB數(shù)據(jù)字典會(huì)根據(jù)重做日志中的信息來(lái)初始化計(jì)數(shù)器的內(nèi)存值,就可以恢復(fù)到了上次關(guān)閉數(shù)據(jù)庫(kù)前的狀態(tài),通過(guò)自增ID持久化來(lái)避免8.0之前可能會(huì)出現(xiàn)的問(wèn)題。

三、自增主鍵測(cè)試

分別在MySQL5和MySQL8上進(jìn)行自增主鍵測(cè)試。

1、MySQL5.7自增主鍵

在MySQL5.7中的,這里我們先創(chuàng)建一個(gè)數(shù)據(jù)表,這個(gè)數(shù)據(jù)表中設(shè)置一個(gè)自增列。

CREATE TABLE t_test_auto_increment_tjt(
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
  `test_key` varchar(50) NOT NULL COMMENT '名稱(chēng)',
  `test_value` varchar(50) DEFAULT NULL COMMENT '值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='測(cè)試主鍵自增表';

然后向自增主鍵表中添加了4條記錄,表中的四條添加的記錄的id字段值就分別為: 1、2、3、4。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES
('0','吞噬星空','停更'),
('0','水斗大陸','可以停播了'),
('0','武神主宰','裝B還得看塵少'),
('0','完美世界','yyds')

插入數(shù)據(jù)的SQL添加的是0,其實(shí)就是默認(rèn)賦值,表 t_test_auto_increment_tjt 中的自增列是不可以添加0或者null的,那么這個(gè)時(shí)候表中的四條添加的記錄的id字段值就分別為: 11、2、3、4。

接下來(lái),將表中的id為4的字段刪除。

DELETE FROM t_test_auto_increment_tjt WHERE id = 4

然后,繼續(xù)在表中添加一條記錄,執(zhí)行之后我們可以發(fā)現(xiàn),此時(shí)自增主鍵的ID結(jié)果是5。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES ('0','完美世界','yyds-YYDS')

因?yàn)槲覀兦懊嬉呀?jīng)將表中id為4的記錄刪除了,這個(gè)時(shí)候下一次自增的時(shí)候即使表中沒(méi)有id為4的字段了,但是這個(gè)時(shí)候我們也不會(huì)添加4,而是添加5。其實(shí)這個(gè)時(shí)候就是自增主鍵的值auto_increment 大于了max(primary key)+1。

再接下來(lái),將表中的id為5的記錄刪除。

DELETE FROM t_test_auto_increment_tjt WHERE id = 5

最后,重啟MySQL數(shù)據(jù)庫(kù),再向表中添加一條記錄。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES ('0','完美世界','yyds-YYDS-restart')

上圖可以看到,重啟后 重啟后 重啟后 執(zhí)行的結(jié)果中添加的記錄的id值為 : 4, 按之前的操作來(lái)看4和5已經(jīng)被刪除了,那么添加的就應(yīng)該是6,為什么是4呢?

因?yàn)樵贛ySQL5.7中,自增主鍵的分配規(guī)則是由InnoDB數(shù)據(jù)字典內(nèi)部一個(gè)計(jì)數(shù)器來(lái)決定的,而該計(jì)數(shù)器維護(hù)在了內(nèi)存中,并不會(huì)持久化到磁盤(pán)中,此時(shí)硬盤(pán)中并無(wú)數(shù)據(jù),當(dāng)數(shù)據(jù)庫(kù)重啟之后該計(jì)數(shù)器會(huì)被初始化為: auto_increment = max(primary key)+1,所以記錄的id=4,而不是6。

2、MySQL8自增主鍵

在MySQL8中,按照上述MySQL5.7的操作步驟測(cè)試自增主鍵問(wèn)題。

首先創(chuàng)建自增主鍵表、插入數(shù)據(jù)。

然后,刪除數(shù)據(jù)、插入數(shù)據(jù)。

最后,重啟 重啟 重啟 重啟后插入數(shù)據(jù)。

一定要徹底關(guān)閉MySQL服務(wù),然后重新啟動(dòng)。

重啟后插入數(shù)據(jù),測(cè)試自增主鍵ID的值?

總結(jié)

到此這篇關(guān)于MySQL8自增主鍵變化的文章就介紹到這了,更多相關(guān)MySQL8自增主鍵變化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL 用 limit 為什么會(huì)影響性能

    MySQL 用 limit 為什么會(huì)影響性能

    對(duì)于小的偏移量,直接使用limit來(lái)查詢(xún)沒(méi)有什么問(wèn)題,但隨著數(shù)據(jù)量的增大,越往后分頁(yè),limit語(yǔ)句的偏移量就會(huì)越大,速度也會(huì)明顯變慢,接下來(lái)文章就向大家介紹其的原由,感興趣的小伙伴可參考下面文章具體內(nèi)容
    2021-09-09
  • 解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別

    解析:內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別

    本篇文章是對(duì)內(nèi)聯(lián),左外聯(lián),右外聯(lián),全連接,交叉連接的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • MySQL數(shù)據(jù)庫(kù)實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)設(shè)計(jì)

    MySQL數(shù)據(jù)庫(kù)實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)設(shè)計(jì)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)實(shí)驗(yàn)實(shí)現(xiàn)簡(jiǎn)單數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)設(shè)計(jì),文章通過(guò)理解并能運(yùn)用數(shù)據(jù)庫(kù)設(shè)計(jì)的常見(jiàn)步驟來(lái)設(shè)計(jì)滿(mǎn)足給定需求的概念模和關(guān)系數(shù)據(jù)模型展開(kāi)詳情,需要的朋友可以參考一下
    2022-06-06
  • MySQL函數(shù)與存儲(chǔ)過(guò)程字符串長(zhǎng)度限制的解決

    MySQL函數(shù)與存儲(chǔ)過(guò)程字符串長(zhǎng)度限制的解決

    本文主要介紹了MySQL函數(shù)與存儲(chǔ)過(guò)程字符串長(zhǎng)度限制的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • sql?distinct多個(gè)字段的使用

    sql?distinct多個(gè)字段的使用

    這篇文章主要介紹了sql?distinct多個(gè)字段的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL最常問(wèn)的十道面試題(2023年最新詳解版)

    MySQL最常問(wèn)的十道面試題(2023年最新詳解版)

    MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),這是學(xué)習(xí)Java必學(xué)的知識(shí)點(diǎn),也是面試java崗位必考的題目,所以大家要有所重視,這篇文章主要給大家介紹了關(guān)于MySQL最常問(wèn)的十道面試題,是2023年最新詳細(xì)整理的,需要的朋友可以參考下
    2023-10-10
  • 一文詳解MySQL8.0的索引新特性

    一文詳解MySQL8.0的索引新特性

    MySQL中的索引可以為提高我們的查詢(xún)效率,相比較于低版本, MySQL 8.0中針對(duì)索引做了不少的優(yōu)化,本文主要給大家分享一些MySQL8.0索引的新特性,希望大家可以在日常的開(kāi)發(fā)中根據(jù)實(shí)際場(chǎng)景用起來(lái)
    2023-07-07
  • 淺析MySQL 備份與恢復(fù)

    淺析MySQL 備份與恢復(fù)

    這篇文章主要介紹了MySQL 備份與恢復(fù)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • Mac系統(tǒng)下MySql下載MySQL5.7及詳細(xì)安裝圖解

    Mac系統(tǒng)下MySql下載MySQL5.7及詳細(xì)安裝圖解

    這篇文章主要介紹了Mac系統(tǒng)下MySql下載MySQL5.7及詳細(xì)安裝圖解,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-11-11
  • php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    php mysql連接數(shù)據(jù)庫(kù)實(shí)例

    這篇文章主要介紹了php mysql連接數(shù)據(jù)庫(kù)實(shí)例,需要的朋友可以參考下
    2016-09-09

最新評(píng)論