【MySQL】触发器及其应用——如何将主键默认值设为UUID()
(1)触发器:
什么是触发器?触发器的使用场景有哪些?
触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。触发器是指一段代码,当触发某个事件时,自动执行这些代码。
使用场景
- 可以通过数据库中的相关表实现级联更改。
- 实时监控某张表中的某个字段的更改而需要做出相应的处理。
- 例如可以生成某些业务的编号。
- 注意不要滥用,否则会造成数据库及应用程序的维护困难。
- 大家需要牢记以上基础知识点,重点是理解数据类型CHAR和VARCHAR的差异,表存储- 引擎InnoDB和MyISAM的区别。
MySQL中都有哪些触发器?
在MySQL数据库中有如下六种触发器:
Before Insert
After Insert
Before Update
After Update
Before Delete
After Delete
(2)如何将主键默认值设为UUID()
1、问题
mysql中在设置主键(id)的默认值时,有一下两种情况:
- 当 id 为 int 类型时,可以直接在创建表时设置id为 id primary key auto_increase,即默认 id 为主键自增长。
- 当 id 为 varchar 类型时,要设置主键 id 默认值为唯一且不同字符串,这时需要使用UUID()函数,但是mysql中不支持默认值为函数,本文就是为了解决这个问题。
2、解决方案
首先,需要先创建一个表,SQL语句如下:
CREATE TABLE traveller(
id VARCHAR(50) PRIMARY KEY,-- 要设置默认值为UUID()的主键
NAME VARCHAR(32),
sex VARCHAR(20),
phoneNum VARCHAR(20),
credentialsType INT,
credentialsNum VARCHAR(50),
travellerType INT
);
在创建完表之后,需要创建一个触发器,从而将主键的默认值设定为UUID()生成的字符串。
触发器模板:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `ssm`.`idd` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `ssm`.`<Table Name>`
FOR EACH ROW BEGIN
END$$
DELIMITER ;
在创建好的触发器中编写的代码如下:
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
TRIGGER `ssm`.`id_trigger` -- 触发器名称
BEFORE INSERT -- 触发器被触发的时机
ON `ssm`.`product` -- 触发器所作用的表名称
FOR EACH ROW BEGIN
SET new.id=REPLACE(UUID(),'-',''); -- 触发器执行的逻辑
END$$
DELIMITER ;
对于触发器的编写做以下总结:
- create trigger ssm.id_trigger中 ssm.id_trigger为触发器名称,可任意指定。
- 触发器被触发的时机:在使用 insert/delete/update 这三种SQL语句对于指定表进行操作之前或之后(before/after)。
在于语句中的表现: BEFORE INSERT ON ssm.product即是在对ssm.product表进行 insert 操作之前 触发器被触发。
- 触发器的执行逻辑:在 begin 和 end 之间的SET new.id = replace(UUID(),’-’,’’); ,即指定新的id值为: UUID()函数生成的字符串中的 ‘-’ 被替换为 ‘’ 之后的字符串。
在触发器设定好之后,对于traveller表执行语句,所得结果为:
若触发器中所写逻辑为:
SET new.id=UUID();
插入后的结果应为:
从以上对比中,可以知道这两种不同逻辑的区别。
3、总结
最后要知道该问题解决后所带来的优点和缺点:
发现mysql好像并不支持在建表时,为某一字段指定默认函数值。但是在Oracle数据库中,却支持这样干,也就可以实现插入数据时,自动生成uuid。
所以在mysql中只能在插入数据时,将uuid()函数值赋值给id字段。
但是,我可以去写一个触发器,每次在执行插入操作时,都为id字段更新为uuid()。
因为id在业务层面一般是无意义的,如果只是为了实现主键自增长,那请用auto_increment吧
优点:使用UUID()函数生成的唯一标识来作为默认id值,使得用户的 id 更加安全。
缺点:UUID()函数所生成的唯一标识过长,在高并发情况下影响效率,一般在该场景下不推荐使用。