MySQL實現自動使用uuid作為主鍵以及解決不能調用觸發器的一點思路


這里使用觸發程序實現此功能.

觸發程序語法如下:

Create trigger <tri_name>

{before|after}

{insert|update|delete}

On <tab_name>

For each row

<觸發程序SQL語句>

核心代碼:

 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

運行了三次插入操作,結果如下:

使用觸發器可實現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 就行了.

 


免責聲明!

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



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