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

解決mysql的int型主鍵自增問題

 更新時間:2021年07月14日 14:58:59   作者:編程小龍  
這篇文章主要介紹了解決mysql的int型主鍵自增問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

引入

我們在使用mysql數據庫時,習慣使用int型作為主鍵,并設置為自增,這既能夠保證唯一,使用起來又很方便,但int型的長度是有限的,如果超過長度怎么辦呢?

暴露問題

我們先創(chuàng)建一個測試表,創(chuàng)建語句如下:

CREATE TABLE test1 (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
)

然后我們插入兩條數據:

INSERT INTO test1 VALUES(NULL,'小牛');
INSERT INTO test1 VALUES(NULL,'大牛');

查詢表顯示正常:

在這里插入圖片描述

int型的有符號的范圍為231 -1 = 2147483647,我們直接插入一條數據id為2147483647,如下:

INSERT INTO test1 VALUES(2147483647 ,'小華')

結果顯示正常:

在這里插入圖片描述

此時自增ID已達到了int型的上限,如果我再插入數據,就會報錯:

INSERT INTO test1 VALUES(NULL,'母牛');

在這里插入圖片描述

此時主鍵已無法自增,插入的id仍然是2147483647,就違反了主鍵唯一的條件,所以報錯。

解決問題

(1)使用更大的數據類型bigint

bigint的范圍是263-1,所謂指數爆炸,此時的大小達到了9,223,372,036,854,775,807的可怕量級,簡單來說就是用bigint 一天100w條數據也得存200億年才能自增爆炸,所以在當前場景,幾乎不用擔心bigint會自增滿

我們修改數據類型為bigint,如圖

在這里插入圖片描述

再執(zhí)行插入語句:

INSERT INTO test1 VALUES(NULL,'母牛');

又能夠正常插入了:

在這里插入圖片描述

(2)使用UUID作為主鍵

我們都知道,UUID會根據當前系統(tǒng)性能,時間戳等一系列參數經過運算得到一個全世界唯一的字符串,并且mysql提供了生成UUID的方法,用它作為主鍵能夠保證數據的唯一性。

利用如下代碼可以生成32位的UUID:

-- 生成32位UUID
SELECT REPLACE(UUID(),'-','') AS UUID;

在這里插入圖片描述

然后咱們再創(chuàng)建一個測試表:

CREATE TABLE test2(
  id VARCHAR(50) PRIMARY KEY,
  NAME VARCHAR(20) NOT NULL
)

插入一條數據:

-- 插入UUID
INSERT INTO test2 VALUES(REPLACE(UUID(),'-',''),'老王');

在這里插入圖片描述

但這樣寫插入語句每次都要手寫UUID函數,貌似有點太麻煩了,咱們可以寫一個觸發(fā)器,讓觸發(fā)器自動為我們設置ID:

-- 創(chuàng)建觸發(fā)器
DELIMITER $$
CREATE
TRIGGER auto_id        -- 名稱
BEFORE INSERT          -- 觸發(fā)時機
ON test2 FOR EACH ROW   -- 作用于test2表,對每行數據生效
BEGIN
IF new.id = '' THEN     -- 當id為空字符串時設置UUID
  SET new.id = REPLACE(UUID(),'-','');
END IF;
END$$

插入一條數據:

-- 插入一條數據
INSERT INTO test2 VALUES('','小王');

結果能正常添加

在這里插入圖片描述

總結

(1) 用int型和bigInt型增刪改查速度較UUID更快,并且更節(jié)省空間。

(2) 用UUID更方便。

為何要使用自增int作為主鍵

相信大家都知道要使用無符號自增int作為主鍵的數據類型,可你知道為何要使自用增int而不是使用varchar、text、varchar等類型嗎?

大家也能說出一些優(yōu)點:對上層業(yè)務透明,插入數據時無需顯示指定;數據類型簡單,更便于存儲維護表結構

其實,使用自增int作為主鍵好處多多,今天我們就來一起學習一下,并強烈建議大家在實際開發(fā)中使用自增int作為主鍵。

優(yōu)點:

1、int 相比varchar、char、text使用更少的存儲空間,而且數據類型簡單,可以節(jié)約CPU的開銷,更便于表結構的維護

2、默認都會在主鍵上建立主鍵索引,使用整形作為主鍵可以將更多的索引載入內存,提高查詢性能

3、對于InnoDB存儲引擎而言,每個二級索引都會使用主鍵作為索引值的后綴,使用自增主鍵可以減少索引的長度(大?。?,方便更多的索引數據載入內存

4、可以使索引數據更加緊湊,在數據插入、刪除、更新時可以做到索引數據盡可能少的移動、分裂頁,減少碎片的產生(可以通過optimize table 來重建表),減少維護開銷

5、在數據插入時,可以保證邏輯相鄰的元素物理也相鄰,便于范圍查找

當然,使用自增int作為主鍵也不是百利無一害,在高并發(fā)的情況下也可能會造成鎖的爭用問題。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • mysql8.0數據庫無法被遠程連接問題排查小結

    mysql8.0數據庫無法被遠程連接問題排查小結

    本文主要介紹了mysql8.0數據庫無法被遠程連接問題排查小結
    2024-07-07
  • 理解MySQL存儲過程和函數

    理解MySQL存儲過程和函數

    這篇文章主要幫助大家學習理解MySQL存儲過程和函數,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 解決Mysql服務器啟動時報錯問題的方法

    解決Mysql服務器啟動時報錯問題的方法

    這篇文章主要介紹了解決Mysql服務器啟動時報錯問題的方法,需要的朋友可以參考下
    2015-11-11
  • MySQL數據庫中CAST與CONVERT函數實現(xiàn)類型轉換的講解

    MySQL數據庫中CAST與CONVERT函數實現(xiàn)類型轉換的講解

    今天小編就為大家分享一篇關于MySQL數據庫中CAST與CONVERT函數實現(xiàn)類型轉換的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • mysql手動刪除BINLOG的方法

    mysql手動刪除BINLOG的方法

    用于刪除列于在指定的日志或日期之前的日志索引中的所有二進制日志。這些日志也會從記錄在日志索引文件
    2013-03-03
  • win2008下mysql8.0.11升級mysql8.0.17版本詳細步驟

    win2008下mysql8.0.11升級mysql8.0.17版本詳細步驟

    這篇文章主要為大家詳細介紹了win2008下mysql8.0.11升級mysql8.0.17版本詳細步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Mysql添加用戶和設置權限的操作方法

    Mysql添加用戶和設置權限的操作方法

    這篇文章主要介紹了Mysql添加用戶和設置權限的操作方法,主要包括管理用戶,權限控制的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • mysql忘記密碼重置的方法實現(xiàn)

    mysql忘記密碼重置的方法實現(xiàn)

    本文主要介紹了mysql忘記密碼重置的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 如何通過yum方式安裝mysql數據庫

    如何通過yum方式安裝mysql數據庫

    部署MySQL數據庫有多種部署方式,常用的部署方式就有三種,yum安裝、rpm安裝以及編譯安裝,這篇文章主要給大家介紹了關于如何如果通過yum方式安裝mysql數據庫的相關資料,需要的朋友可以參考下
    2024-01-01
  • mysql自定義排序順序語句

    mysql自定義排序順序語句

    這篇文章主要介紹了mysql 自定義排序順序,在sql語句中加入ORDER BY FIELD,需要的朋友可以參考下
    2014-02-02

最新評論