MySQL实现自动使用uuid做为主键以及解决不能调用触发器的一点思路

这里使用触发程序实现此功能.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 就好了.

相关文章
相关标签/搜索