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

Posted Tomas曼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 就行了.

 

以上是关于MySQL实现自动使用uuid作为主键以及解决不能调用触发器的一点思路的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能用 uuid 做 MySQL 的主键!?

使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

mysql为什么不推荐使用uuid或者雪花id作为主键

java UUID.randomUUID()自动生成主键作为Id或文件路径

MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)