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

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

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

引入

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

暴露問題

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

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

然后我們插入兩條數(shù)據(jù):

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

查詢表顯示正常:

在這里插入圖片描述

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

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

結(jié)果顯示正常:

在這里插入圖片描述

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

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

在這里插入圖片描述

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

解決問題

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

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

我們修改數(shù)據(jù)類型為bigint,如圖

在這里插入圖片描述

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

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

又能夠正常插入了:

在這里插入圖片描述

(2)使用UUID作為主鍵

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

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

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

在這里插入圖片描述

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

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

插入一條數(shù)據(jù):

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

在這里插入圖片描述

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

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

插入一條數(shù)據(jù):

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

結(jié)果能正常添加

在這里插入圖片描述

總結(jié)

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

(2) 用UUID更方便。

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

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

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

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

優(yōu)點:

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

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

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

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

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

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

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

相關(guān)文章

  • 使用MySQL子查詢和CASE語句判斷關(guān)聯(lián)狀態(tài)

    使用MySQL子查詢和CASE語句判斷關(guān)聯(lián)狀態(tài)

    在這篇文章中,我們將詳細講解如何使用 MySQL 的子查詢和 CASE 語句來實現(xiàn)復(fù)雜的邏輯判斷,具體案例是我們有兩個表 card_management 和 card_auth_register,通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-06-06
  • mysql如何匹配數(shù)組字段中的某一個具體值

    mysql如何匹配數(shù)組字段中的某一個具體值

    在數(shù)據(jù)庫操作中,有時需要查詢數(shù)組字段中包含特定值的數(shù)據(jù),傳統(tǒng)like查詢可能會帶來錯誤結(jié)果,如查詢包含數(shù)字1的數(shù)組可能錯誤返回包含數(shù)字10的結(jié)果,為此,可以使用MySQL的FIND_IN_SET函數(shù)或REGEXP正則表達式進行精確匹配,FIND_IN_SET適用于匹配單個固定值
    2024-11-11
  • MySQL的日志基礎(chǔ)知識及基本操作學(xué)習(xí)教程

    MySQL的日志基礎(chǔ)知識及基本操作學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的日志基礎(chǔ)知識學(xué)習(xí)教程,包括MySQL中日志相關(guān)常用的服務(wù)器變量說明,極力推薦!需要的朋友可以參考下
    2015-11-11
  • MySQL性能分析工具profile使用教程

    MySQL性能分析工具profile使用教程

    這篇文章主要介紹了MySQL性能分析工具profile使用教程,本文描述了如何使用MySQL profile,不涉及具體的樣例分析,需要的朋友可以參考下
    2014-10-10
  • MySQL case when使用方法實例解析

    MySQL case when使用方法實例解析

    這篇文章主要介紹了MySQL case when使用方法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • mysql百萬數(shù)據(jù)表加索引優(yōu)化的方法

    mysql百萬數(shù)據(jù)表加索引優(yōu)化的方法

    在大數(shù)據(jù)時代,隨著數(shù)據(jù)量的快速增長,對數(shù)據(jù)庫的索引優(yōu)化變得尤為重要,本文主要介紹了mysql百萬數(shù)據(jù)表加索引優(yōu)化的方法,感興趣的可以了解一下
    2024-02-02
  • 如何用Navicat操作MySQL

    如何用Navicat操作MySQL

    這篇文章主要介紹了如何用Navicat操作MySQL,幫助大家使用可視化工具來連接 MySQL,感興趣的朋友可以了解下
    2021-05-05
  • MYSQL導(dǎo)入導(dǎo)出命令詳解

    MYSQL導(dǎo)入導(dǎo)出命令詳解

    網(wǎng)上看了一些總結(jié)出來的資料,不知道對大家有沒有用的,有用的話也就不枉費我一按按鈕的一片苦心了
    2007-09-09
  • MYSQL中的簡單查詢

    MYSQL中的簡單查詢

    這篇文章詳細介紹了MySQL中常見的查詢語法,包括SELECT語句的簡單查詢、基于表的查詢、基于條件的查詢、基于分組的查詢等,它還解釋了COUNT()、SUM()、AVG()、MAX()和MIN()等聚合函數(shù)的使用,以及GROUP BY和HAVING子句在分組查詢中的應(yīng)用
    2025-02-02
  • MySQL物理備份與恢復(fù)工具XtraBackup使用小結(jié)

    MySQL物理備份與恢復(fù)工具XtraBackup使用小結(jié)

    本文主要介紹了MySQL物理備份與恢復(fù)工具XtraBackup使用小結(jié),借助Percona XtraBackup工具實現(xiàn)MySQL的物理備份與恢復(fù),相當(dāng)于將整個MySQL進行了復(fù)制,再粘貼到其他地方運行,感興趣的可以了解一下
    2024-07-07

最新評論

甘洛县| 马关县| 济宁市| 苍梧县| 寻甸| 项城市| 小金县| 南溪县| 梧州市| 铁岭市| 禄劝| 达孜县| 博爱县| 鄂托克旗| 肇东市| 郎溪县| 望都县| 普定县| 余江县| 嘉义县| 兖州市| 齐齐哈尔市| 抚松县| 忻城县| 峨边| 昌宁县| 勃利县| 施甸县| 灯塔市| 成武县| 易门县| 汽车| 双城市| 龙海市| 晋宁县| 寿阳县| 新昌县| 肇州县| 东乌珠穆沁旗| 巩义市| 政和县|