關於mysql的int型主鍵自增問題

2021-10-23 11:47:52 字數 2836 閱讀 1000

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

我們先建立乙個測試表,建立語句如下:

create

table test1 (

id int

primary

keyauto_increment

, name varchar(20

))

然後我們插入兩條資料:

insert

into test1 values

(null

,'小牛');

insert

into test1 values

(null

,'大牛'

);

查詢表顯示正常:

,'小華'

)結果顯示正常:

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

insert

into test1 values

(null

,'母牛'

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

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

我們修改資料型別為bigint,如圖

再執行插入語句:

insert

into test1 values

(null

,'母牛'

);

又能夠正常插入了:

我們都知道,uuid會根據當前系統效能,時間戳等一系列引數經過運算得到乙個全世界唯一的字串,並且mysql提供了生成uuid的方法,用它作為主鍵能夠保證資料的唯一性。

利用如下**可以生成32位的uuid:

-- 生成32位uuid

)

插入一條資料:

-- 插入uuid

insert

into test2 values

(replace

(uuid(),

'-','')

,'老王'

但這樣寫插入語句每次都要手寫uuid函式,貌似有點太麻煩了,咱們可以寫乙個觸發器,讓觸發器自動為我們設定id:

-- 建立觸發器

delimiter $$

create

trigger auto_id -- 名稱

before insert

-- 觸發時機

on test2 for each row

-- 作用於test2表,對每行資料生效

begin

if new.id =

''then

-- 當id為空字串時設定uuid

set new.id =

replace

(uuid(),

'-','')

;endif;

end$$

插入一條資料:

-- 插入一條資料

insert

into test2 values(''

,'小王'

);

結果能正常新增

(1)用int型和bigint型增刪改查速度較uuid更快,並且更節省空間。

(2)用uuid更方便。

更詳細的比較資訊參考這篇博文:

mysql 使用自增id主鍵和uuid 作為主鍵的優劣比較詳細過程(從百萬到千萬表記錄測試)

關於 mysql 主鍵自增問題

mysql 引擎 innodb引擎 低版本 innodb表中把自增列作為主鍵id時,自增列是通過auto increment計數器實現的,計數器的最大值是記錄到記憶體中的,重啟資料庫後,會導致auto increment計數器重置,從而會導致主鍵id重置。myisam引擎 myisam表會把自增列 ...

mysql 主鍵自增語句 MySQL 自增主鍵

以下僅考慮 innodb 儲存引擎。自增主鍵有兩個性質需要考慮 單調性每次插入一條資料,其 id 都是比上一條插入的資料的 id 大,就算上一條資料被刪除。連續性插入成功時,其資料的 id 和前一次插入成功時資料的 id 相鄰。自增主鍵的單調性 為何會有單調性的問題?這主要跟自增主鍵最大值的獲取方式...

mysql的自增主鍵

autotest表是測試表 mysql版本為5.7 結構如下 1.insert into指定自增主鍵的值時,自增主鍵會變嗎?以下是表中資料的初始值 接著插入自增主鍵9 如果insert指定自增主鍵的值不會導致auto increment值的變化的話,那麼接著不指定自增主鍵的值執行insert語句時,...