MySQL中如何將主鍵默認值設為UUID()


1、問題

mysql中在設置主鍵(id)的默認值時,有一下兩種情況:

  • 當 id 為 int 類型時,可以直接在創建表時設置id為 id primary key auto_increase,即默認 id 為主鍵自增長。
  • 當 id 為 varchar 類型時,要設置主鍵 id 默認值為唯一且不同字符串,這時需要使用UUID()函數,但是mysql中不支持默認值為函數,本文就是為了解決這個問題。

2、解決方案

首先,需要先創建一個表,SQL語句如下:

CREATE TABLE traveller(
 id VARCHAR(50) PRIMARY KEY,-- 要設置默認值為UUID()的主鍵
 NAME VARCHAR(32),
 sex VARCHAR(20),
 phoneNum VARCHAR(20),
 credentialsType INT,
 credentialsNum VARCHAR(50),
 travellerType INT
);

在創建完表之后,需要創建一個觸發器,從而將主鍵的默認值設定為UUID()生成的字符串。
觸發器的創建
在創建好的觸發器中編寫的代碼如下:

DELIMITER $$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    TRIGGER `ssm`.`id_trigger` -- 觸發器名稱
    BEFORE INSERT             -- 觸發器被觸發的時機
    ON `ssm`.`traveller`       -- 觸發器所作用的表名稱
    FOR EACH ROW BEGIN
		SET new.id=REPLACE(UUID(),'-',''); -- 觸發器執行的邏輯
    END$$

DELIMITER ;

對於觸發器的編寫做以下總結:

  • create trigger ssm.id_triggerssm.id_trigger為觸發器名稱,可任意指定。
  • 觸發器被觸發的時機:在使用 insert/delete/update 這三種SQL語句對於指定表進行操作之前或之后(before/after)。

在於語句中的表現: BEFORE INSERT ON ssm.traveller 即是在對ssm.traveller表進行 insert 操作之前 觸發器被觸發。

  • 觸發器的執行邏輯:在 begin 和 end 之間的SET new.id = replace(UUID(),’-’,’’); ,即指定新的id值為: UUID()函數生成的字符串中的 ‘-’ 被替換為 ‘’ 之后的字符串。

在觸發器設定好之后,對於traveller表執行以下語句:

INSERT INTO 
traveller(NAME,sex,phoneNum,credentialsType,credentialsNum,travellerType) 
VALUES('jay','男','13222222222',0,'1234567890026',0);

所得到的的結果為:
所得結果

若觸發器中所寫邏輯為:

SET new.id=UUID(); 

插入后的結果應為:
原始結果
從以上對比中,可以知道這兩種不同邏輯的區別。

3、總結

最后要知道該問題解決后所帶來的優點和缺點:

  • 優點:使用UUID()函數生成的唯一標識來作為默認id值,使得用戶的 id 更加安全。
  • 缺點:UUID()函數所生成的唯一標識過長,在高並發情況下影響效率,一般在該場景下不推薦使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM