亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL的自增ID(主鍵) 用完了的解決方法

 更新時間:2020年09月11日 11:01:49   作者:銘之博客  
這篇文章主要介紹了MySQL的自增ID(主鍵) 用完了的解決方法,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

在 MySQL 中用很多類型的自增 ID,每個自增 ID 都設(shè)置了初始值。一般情況下初始值都是從 0 開始,然后按照一定的步長增加(一般是自增 1)。一般情況下,我們都是用int(11)來作為數(shù)據(jù)表的自增 ID,在 MySQL 中只要定義了這個數(shù)的字節(jié)長度,那么就會有上限。

MySQL的自增ID(主鍵) 用完了,怎么辦?

如果用 int unsigned (int,4個字節(jié) ), 我們可以算下最大當(dāng)前聲明的自增ID最大是多少,由于這里定義的是 int unsigned,所以最大可以達(dá)到2的32冪次方 - 1 = 4294967295。

這里有個小技巧,可以在創(chuàng)建表的時候,直接聲明AUTO_INCREMENT的初始值為4294967295。

create table `test` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295;

SQL插入語句

insert into `test` values (null);

當(dāng)想再嘗試插入一條數(shù)據(jù)時,得到了下面的異常結(jié)果。

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

說明,當(dāng)再次插入時,使用的自增ID還是 4294967295,報主鍵沖突的錯誤,這說明 ID 值達(dá)到上限之后,就不會再變化了。4294967295,這個數(shù)字已經(jīng)可以應(yīng)付大部分的場景了,如果你的服務(wù)會經(jīng)常性的插入和刪除數(shù)據(jù)的話,還是存在用完的風(fēng)險,建議采用 bigint unsigned ,這個數(shù)字就大了。

bigint unsigned 的范圍是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數(shù)據(jù)(所有數(shù)字), 存儲大小為 8 個字節(jié)。

不過,還存在另一種情況,如果在創(chuàng)建表沒有顯示申明主鍵,會怎么辦?

如果是這種情況,InnoDB會自動幫你創(chuàng)建一個不可見的、長度為6字節(jié)的row_id,而且InnoDB 維護(hù)了一個全局的 dictsys.row_id,所以未定義主鍵的表都共享該row_id,每次插入一條數(shù)據(jù),都把全局row_id當(dāng)成主鍵id,然后全局row_id加 1。

該全局row_id在代碼實現(xiàn)上使用的是bigint unsigned類型,但實際上只給row_id留了6字節(jié),這種設(shè)計就會存在一個問題:如果全局row_id一直漲,一直漲,直到2的48冪次-1時,這個時候再+1,row_id的低48位都為0,結(jié)果在插入新一行數(shù)據(jù)時,拿到的row_id就為0,存在主鍵沖突的可能性。

所以,為了避免這種隱患,每個表都需要定一個主鍵。

總結(jié)

數(shù)據(jù)庫表的自增 ID 達(dá)到上限之后,再申請時它的值就不會在改變了,繼續(xù)插入數(shù)據(jù)時會導(dǎo)致報主鍵沖突錯誤。因此在設(shè)計數(shù)據(jù)表時,盡量根據(jù)業(yè)務(wù)需求來選擇合適的字段類型。

以上就是MySQL的自增ID(主鍵) 用完了的解決方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL 自增ID(主鍵)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql三種常用的刪除數(shù)據(jù)或者表的方式

    Mysql三種常用的刪除數(shù)據(jù)或者表的方式

    本文主要介紹了Mysql三種常用的刪除數(shù)據(jù)或者表的方式,它們分別是?TRUNCATE、DROP?和?DELETE,下面就詳細(xì)的介紹一下這三種的使用,感興趣的可以了解一下
    2024-01-01
  • 淺談為什么Mysql數(shù)據(jù)庫盡量避免NULL

    淺談為什么Mysql數(shù)據(jù)庫盡量避免NULL

    這篇文章主要介紹了淺談為什么Mysql數(shù)據(jù)庫盡量避免NULL,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • mysql-connector-java與Mysql、Java的對應(yīng)版本問題

    mysql-connector-java與Mysql、Java的對應(yīng)版本問題

    這篇文章主要介紹了mysql-connector-java與Mysql、Java的對應(yīng)版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spark SQL常見4種數(shù)據(jù)源詳解

    Spark SQL常見4種數(shù)據(jù)源詳解

    這篇文章主要介紹了Spark SQL常見4種數(shù)據(jù)源(詳細(xì)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • 詳解mysql基本操作語句命令

    詳解mysql基本操作語句命令

    本文介紹了 鏈接Mysql,以及增刪改查等功能,需要的朋友可以參考
    2017-04-04
  • mysql alter table命令修改表結(jié)構(gòu)實例

    mysql alter table命令修改表結(jié)構(gòu)實例

    這篇文章主要介紹了mysql alter table命令修改表結(jié)構(gòu)實例的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • mysqldump造成Buffer Pool污染的研究

    mysqldump造成Buffer Pool污染的研究

    mysqldump造成Buffer Pool污染的研究,需要的朋友可以參考下
    2012-10-10
  • Mysql中通用表達(dá)式WITH?AS語句的使用實例代碼

    Mysql中通用表達(dá)式WITH?AS語句的使用實例代碼

    with as也叫子查詢,用來定義一個sql片段,且該片段會被整個sql語句反復(fù)使用很多次,這個sql片段就相當(dāng)于是一個公用臨時表,下面這篇文章主要給大家介紹了關(guān)于Mysql中通用表達(dá)式WITH?AS語句使用的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 詳解sql中的參照完整性(一對一,一對多,多對多)

    詳解sql中的參照完整性(一對一,一對多,多對多)

    這篇文章主要介紹了sql中的參照完整性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用SQL將多行記錄合并成一行實例代碼

    使用SQL將多行記錄合并成一行實例代碼

    今天同事問了一個需求,就是將多行數(shù)據(jù)合并成一行進(jìn)行顯示,查詢了一些資料,這篇文章主要給大家介紹了關(guān)于使用SQL將多行記錄合并成一行的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評論