1. 程式人生 > 其它 >MySQL實現自動使用uuid作為主鍵(附帶解決觸發器不生效案例)

MySQL實現自動使用uuid作為主鍵(附帶解決觸發器不生效案例)

技術標籤:javamysql觸發器mysql

這裡使用觸發程式實現此功能.

觸發程式語法如下:

Create trigger <tri_name>

{before|after}

{insert|update|delete}

On <tab_name>

For each row

<觸發程式SQL語句>

核心程式碼:

use t14test
show tables
drop table if exists uuidTest
create table uuidTest(
  testId VARCHAR(36) not NULL DEFAULT '1',
  testData VARCHAR
(32), PRIMARY KEY(`testId`) ) /*建立觸發器*/ /* * terminal建立儲存過程需要定義分隔符 * delimiter // * */ create trigger tri_auto_uuid before insert on uuidTest for each ROW BEGIN if new.testId = '1' THEN set new.testId = (select uuid()); end if; END /*刪除觸發器*/ drop trigger if exists tri_auto_uuid /*插入資料*/ insert into uuidTest(
testData)VALUES('一條資料') select * from uuidTest

運行了三次插入操作,結果如下:
在這裡插入圖片描述
使用觸發器可實現uuid作為主鍵.

有問題的程式碼:

create trigger tri_auto_uuid
after insert
on uuidTest
for each ROW
update uuidTest set testId=((select uuid()))

如果這樣定義觸發程式,看似沒問題,也能新增成功,但是錄入資料會報錯.

Can’t update table ‘tb_user’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

網上說為了避免遞迴觸發,update一條資料後不能觸發對該資料進行除了Set之外的更新操作.否則就會報錯.

可是我這個觸發器是after insert 而且是Set 操作,為什麼會有問題呢?

這裡存在某種原因,可能和遞迴觸發有關係.暫且不去管他底層是如何運作的.只需要改變一下思路,把after insert 改成 before insert 就行了.

詳情見此連結

mysql 自增id和UUID做主鍵效能分析