這裏使用觸發程序實現此功能.ui
觸發程序語法以下:this
Create trigger <tri_name>spa
{before|after}code
{insert|update|delete}blog
On <tab_name>遞歸
For each rowterminal
<觸發程序SQL語句>it
核心代碼:io
1 use t14test 2 show tables 3 drop table if exists uuidTest 4 create table uuidTest( 5 testId VARCHAR(36) not NULL DEFAULT '1', 6 testData VARCHAR(32), 7 PRIMARY KEY(`testId`) 8 ) 9 /*建立觸發器*/ 10 /* 11 * terminal建立存儲過程須要定義分隔符 12 * delimiter // 13 * */ 14 create trigger tri_auto_uuid 15 before insert 16 on uuidTest 17 for each ROW 18 BEGIN 19 if new.testId = '1' THEN set new.testId = (select uuid()); 20 end if; 21 END 22 /*刪除觸發器*/ 23 drop trigger if exists tri_auto_uuid 24 /*插入數據*/ 25 insert into uuidTest(testData)VALUES('一條數據') 26 select * from uuidTest
運行了三次插入操做,結果以下:table
使用觸發器可實現uuid做爲主鍵.
有問題的代碼:
1 create trigger tri_auto_uuid 2 after insert 3 on uuidTest 4 for each ROW 5 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 就好了.