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_trigger中ssm.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()函數所生成的唯一標識過長,在高並發情況下影響效率,一般在該場景下不推薦使用。
