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

mysql自增長id用完了該怎么辦

 更新時(shí)間:2022年02月11日 11:30:40   作者:愛開發(fā)V  
如果你用過或了解過MySQL,那你一定知道自增主鍵了,下面這篇文章主要給大家介紹了關(guān)于mysql自增長id用完了該怎么辦的相關(guān)資料,需要的朋友可以參考下

mysql自增長id用完了,怎么辦?

作為一名程序員,在求職面試時(shí),不知你有沒有遇到類似這樣的問題。

張工是一名java程序員,最近到一家互聯(lián)網(wǎng)公司面試,面試官就問了他這樣的一個(gè)問題。

面試官:"用過mysql吧,你們數(shù)據(jù)表主鍵id是用自增主鍵還是UUID?"   

張工:"用的是自增主鍵"    

面試官:"為什么是自增主鍵?"    

張工:"因?yàn)椴捎米栽鲋麈I,數(shù)據(jù)在物理結(jié)構(gòu)上是順序存儲(chǔ),性能好"    

面試官:"那自增主鍵達(dá)到最大值了,用完了怎么辦?"    

張工:“用完了就用完了,再申請唄”

面試官:“你可以回去等通知了”

今天我們就來談一談,這個(gè)自增主鍵用完了該怎么辦?

在mysql,int整型的范圍如下int的取值范圍為:-2^31——2^31-1,即-2147483648—2147483647

如圖:

cec642de02c5612df27ac603ab76147b.png

以無符號整型為例,存儲(chǔ)范圍為0~4294967295,約43億。當(dāng)自增id達(dá)到最大值時(shí),這是繼續(xù)插入會(huì)出現(xiàn)什么異常呢,

我們來動(dòng)手實(shí)踐下。

首先,創(chuàng)建一張表tb_user,這張表只包含一個(gè)自增id

create table  tb_user(id int unsigned auto_increment primary key) ;

然后向這張表插入一條數(shù)據(jù):

insert into tb_user values(null);

通過show命令show create table tb_user;查看表情況:

CREATE TABLE `tb_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

細(xì)心的你會(huì)發(fā)現(xiàn) AUTO_INCREMENT 已經(jīng)變成2,不過這離最大值4294967295遠(yuǎn)著呢,要想讓它變成4294967295得插入非常多的記錄,其實(shí)不用這么麻煩,我們可以在創(chuàng)建表的時(shí)候,直接聲明AUTO_INCREMENT的初始值。

把我們剛才的創(chuàng)建表語句調(diào)整下,先把剛才的表刪除掉,然后在創(chuàng)建表時(shí)加上auto_increment = 4294967295

create table tb_user(id int unsigned auto_increment primary key) auto_increment = 4294967295;

 然后同樣往表插入一條記錄

insert into tb_user values(null);

同樣,我們通過show命令,查看表tb_user的表結(jié)構(gòu):

CREATE TABLE `tb_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8

通過

select * from tb_user

我們查詢到id 為4294967295,已經(jīng)是最大值,這時(shí)候如果再

當(dāng)想往表在嘗試插入一條數(shù)據(jù)時(shí),報(bào)一個(gè)主鍵沖突異常如下所示。

[SQL]insert into tb_user values(null);
[Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'

這可以說明,當(dāng)再次插入時(shí),使用的自增ID還是4294967295,就會(huì)報(bào)主鍵沖突的異常了。

4294967295,這個(gè)數(shù)字已經(jīng)可以應(yīng)付大部分的場景了,如果你的服務(wù)會(huì)經(jīng)常性的插入和刪除數(shù)據(jù)的話,還是存在用完的風(fēng)險(xiǎn)。

建議采用bigint unsigned,這個(gè)數(shù)字就大了。

那有什么辦法解決,答案是肯定的,解決方法也是很簡單的,將Int類型改為BigInt類型,BigInt的范圍如下

-2^63-1到2^63-1

-9223372036854775808  9223372036854775807

60b16171c8fd2871721816a21e683447.png

就算每秒往數(shù)據(jù)表插入10000條數(shù)據(jù),運(yùn)行100年,來看看數(shù)據(jù)量有多少

10000*24*3600*365*100=31536000000000

這數(shù)字距離BigInt的上限還差的遠(yuǎn),因此你將自增ID設(shè)為BigInt類型,就可以解決問題了。

如果你在面試中是這樣回答面試官的。

你:"這還不簡單,把自增主鍵的類型改為BigInt類型就可以解決了!"

面試官:"你在線上怎么修改列的數(shù)據(jù)類型的?"   

你:"alter table tb_user change id  id bigint;"

面試官:“你有實(shí)際操作經(jīng)驗(yàn)嗎?”

你:“…………沒有實(shí)際操作過”

需要注意的是,這種方式在myl5.6+才開始支持,mysql支持在線修改數(shù)據(jù)庫表,在修改表的過程中,對絕大部分操作,原表可讀,也可以寫。

對于修改數(shù)據(jù)類型這種操作,是不支持并發(fā)的DML操作!也就是說,如果你直接使用alter這樣的語句在線修改表數(shù)據(jù)結(jié)構(gòu),會(huì)導(dǎo)致這張表無法進(jìn)行更新類操作(delete、update、insert)。所以,想在生產(chǎn)線上執(zhí)行修改表結(jié)構(gòu)這樣的方案是不可行的。

那有沒有更好的方式,對于這個(gè)問題,我們以后再做討論。

不知你有沒有留意到這樣一種情況,雖然主鍵自增ID是從0開始的,也就是說,現(xiàn)在可以用的范圍為0~2147483647,但實(shí)際數(shù)據(jù)中有些id的值并不是連續(xù)的。

要是實(shí)際生產(chǎn)表出現(xiàn)單表超過上億的數(shù)據(jù)量了,這時(shí)候想再往數(shù)據(jù)表寫數(shù)據(jù),性能肯定是受影響了,得趕緊考慮分庫分表了。

一旦分庫分表了,我們就不能依賴于每個(gè)表的自增id來全局唯一標(biāo)識這些數(shù)據(jù)了。此時(shí),我們就需要提供一 個(gè)全局唯一的id號生成策略來支持分庫分表的環(huán)境。

所以在實(shí)際中,根本等不到自增主鍵用完的情況。

較友好的回答不妨參考這樣的

面試官:"那自增主鍵達(dá)到最大值了,用完了怎么辦?"   

你:這問題沒遇到過,因?yàn)樽栽鲋麈I我們用int類型,一般達(dá)不到最大值,就要考慮分表分庫了。

要是面試官窮追不舍,繼續(xù)問你有關(guān)分庫分表的要點(diǎn),你也就可以針對性地回答,說明你完全有這方面的開發(fā)經(jīng)驗(yàn),相信能為這次面試加分。

總結(jié):

mysql數(shù)據(jù)庫表的自增 ID 達(dá)到上限之后,這時(shí)候再申請它的值就不會(huì)在改變了,如果繼續(xù)插入數(shù)據(jù)就會(huì)導(dǎo)致報(bào)主鍵沖突異常。

因此在做數(shù)據(jù)字典設(shè)計(jì)時(shí),要根據(jù)業(yè)務(wù)的需求來選擇合適的字段類型。

到此這篇關(guān)于mysql自增長id用完了該怎么辦的文章就介紹到這了,更多相關(guān)mysql自增長id內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL系列之九 mysql查詢緩存及索引

    MySQL系列之九 mysql查詢緩存及索引

    緩存SELECT操作或預(yù)處理查詢的結(jié)果集和SQL語句,當(dāng)有新的SELECT語句或預(yù)處理查詢語句請求,先去查詢緩存,判斷是否存在可用的記錄集,判斷標(biāo)準(zhǔn):與緩存的SQL語句,是否完全一樣,區(qū)分大小寫
    2021-07-07
  • MySQL數(shù)據(jù)庫的高可用方案總結(jié)

    MySQL數(shù)據(jù)庫的高可用方案總結(jié)

    這篇文章主要針對MySQL數(shù)據(jù)庫的高可用方案進(jìn)行詳細(xì)總結(jié),高可用架構(gòu)對于互聯(lián)網(wǎng)服務(wù)基本是標(biāo),本文是對各種方案的總結(jié),感興趣的小伙伴們可以參考一下
    2016-05-05
  • MySQL Explain使用詳解

    MySQL Explain使用詳解

    這篇文章主要介紹了MySQL Explain使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • MySQL如何添加環(huán)境變量和初始化MySQL

    MySQL如何添加環(huán)境變量和初始化MySQL

    本文主要介紹了如何在Windows系統(tǒng)中添加MySQL的環(huán)境變量以及如何初始化MySQL,通過添加環(huán)境變量,可以在任意一個(gè)命令提示符中直接調(diào)用MySQL的相關(guān)程序,大大簡化了操作,初始化MySQL時(shí),需要新建一個(gè)配置文件并指定默認(rèn)編碼集和存儲(chǔ)引擎,如果初始化過程中出現(xiàn)錯(cuò)誤
    2024-11-11
  • MySQL高效可靠處理持久化數(shù)據(jù)的教程指南

    MySQL高效可靠處理持久化數(shù)據(jù)的教程指南

    這篇文章主要給大家詳細(xì)介紹了 MySQL 如何高效可靠處理持久化數(shù)據(jù),文中有詳細(xì)的流程步驟和代碼示例,對我們的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • mysql如何獲取自增id

    mysql如何獲取自增id

    這篇文章主要介紹了mysql如何獲取自增id問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 解讀mysql datetime類型精確到毫秒、微秒的問題

    解讀mysql datetime類型精確到毫秒、微秒的問題

    這篇文章主要介紹了解讀mysql datetime類型精確到毫秒、微秒的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mysql使用教程之分區(qū)表的使用方法(刪除分區(qū)表)

    mysql使用教程之分區(qū)表的使用方法(刪除分區(qū)表)

    mysql分區(qū)表使用方法,新增分區(qū)、刪除分區(qū)、分區(qū)的合并、分區(qū)的拆分等使用方法
    2013-12-12
  • MySQL 5.7.43下載安裝配置的超詳細(xì)教程

    MySQL 5.7.43下載安裝配置的超詳細(xì)教程

    這篇文章主要介紹了MySQL 5.7.43下載安裝配置的超詳細(xì)教程,本文通過實(shí)例圖文結(jié)合的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • MySQL 5.7.9 服務(wù)無法啟動(dòng)-“NET HELPMSG 3534”的解決方法

    MySQL 5.7.9 服務(wù)無法啟動(dòng)-“NET HELPMSG 3534”的解決方法

    這篇文章主要介紹了MySQL 5.7.9 服務(wù)無法啟動(dòng)-“NET HELPMSG 3534”的解決方法,需要的朋友可以參考下
    2016-12-12

最新評論

鄱阳县| 南宫市| 海阳市| 连平县| 汽车| 蓝田县| 蕲春县| 托克托县| 峨边| 从化市| 崇信县| 石楼县| 娄底市| 三都| 安塞县| 潞城市| 闻喜县| 四会市| 达尔| 千阳县| 武义县| 汪清县| 永嘉县| 斗六市| 呼图壁县| 玉田县| 通渭县| 胶州市| 孟州市| 华安县| 藁城市| 乐山市| 尚志市| 贡嘎县| 惠东县| 喀喇| 盱眙县| 三原县| 高安市| 沧州市| 百色市|