什么是触发器
- 可以理解MySQL触发器(Trigger)是一种特殊的SQL语句,或者是存储过程。
- 作用与表上,当表记录的增删改事件(insert,update,delete)发生时,触发器会被激活,执行定义的SQL脚本。
- 使用触发器可以实现数据补全,数据验证,数据复制,日志插入等功能。
语法
create trigger 触发器名称
{before | after } {insert | update | delete} -- 触发器类型和事件
on 表名称
for each row -- 触发器的作用范围
begin
-- 触发器执行的操作
end;
- before / after : 表示触发器的类型,分别表示发生前/发生后执行
- insert / update / delete : 表示触发器的事件类型,分别表示插入 / 更新 / 删除操作
- on 表名称 : 为需要监听的表明
- for each row : 表示触发器作用的范围,即每一行记录都会触发该触发器
- 执行操作中可以是一条简单的sql,也可以是存储过程。根据需要来安排。
在Begin和End之间可以获取到的数据
在执行语句on_tri中,如果要引用更新记录中的字段,还可以使用old和new关键字。
- 对于insert语句,只有new是合法的,表示当前已插入的记录;
- 对于delete语句,只有old才合法,表示当前删除的记录;
查询触发器
show triggers;
删除触发器
drop trigger 触发器名称;
注意点
在使用trigger时,由于mysql语句间默认的分割符是";"但是sql语句中用到了分号,你可能需要自定义分隔符,举个完整的trigger创建的例子
DELIMITER $$
drop trigger IF EXISTS fill_openid_trigger;
CREATE TRIGGER fill_openid_trigger BEFORE UPDATE ON customer FOR EACH ROW
BEGIN
IF NEW.openid IS NULL OR NEW.openid = '' THEN
IF JSON_EXTRACT(NEW.extra_info, '$.openId') IS NOT NULL AND JSON_EXTRACT(NEW.extra_info, '$.openId') <> '' THEN
SET NEW.openid = JSON_UNQUOTE(JSON_EXTRACT(NEW.extra_info, '$.openId'));
END IF;
END IF;
END $$
DELIMITER ;