1.需求
需求:每次更新user表时,根据主键id关联下面两张表,把sys_user中user_name跟新至user中的tmp去
目标表:user、sys_user(内容如下)
2.操作
操作一:
delimiter ## -- 切换自定义结束符号
CREATE DEFINER=`root`@`localhost` TRIGGER `insert_user_from_sys` BEFORE UPDATE ON `user`
FOR EACH ROW begin
declare var varchar(255);
set var = (select user_name from sys_user where id = OLD.id);
set NEW.tmp = var;
end; ##
delimiter ;
结果呈现:
操作二:
操作说明:
触发器载表:sys_user
触发条件:update操作后
触发动作:
首先,查看表user是否存在对应信息,如果存在信息则进行update操作,否则进行insert操作。
delimiter ## -- 切换自定义结束符号
CREATE TRIGGER `update_user` AFTER UPDATE ON `sys_user` FOR EACH ROW begin
declare tmp_class VARCHAR(255);
set tmp_class = new.class;
if exists (select * from user where id = new.id limit 1)
then
update `user`
set `name` = new.user_name
where id = new.id and tmp_class = '2';
else
insert into `user` (`id`,`name`)
select id,user_name from sys_user where id = new.id;
end if ;
end; ##
delimiter ;
3.总结
查看所有触发器:show triggers;
触发器中可以使用变量和多表关联赋值。
-
definer
定义该触发器的用户和主机地址,一般默认为当前用户和主机地址。
-
for each row
行级触发器,修改一行数据触发一次。不写就默认语句级触发器,不管修改多少行数据,只执行一次。
-
before、after
触发器触发状态,二选一; before触发器一般用于在操作数据前,对新数据的值进行修改,表示在触发事件发生之前执行触发程序; after表示在触发事件发生之后执行触发器。
-
update、insert、delete
触发器触发状态,三选一; 在insert操作中,只有new数据行,没有old数据行。(使用old关键字会报错); 在update操作中,new数据行和old数据行存在; 在delete操作中,只有old数据行。(使用new关键字会报错);
-
new、old
MySQL中定义了NEW 和OLD 两个临时表,用来表示触发器的所在表中,触发了触发器的哪一行数据,用来引用触发器中发生变化的记录内容; 1.在 inster 触发器中,NEW 用来拦截并保存将要(before)或者已经(after) 插入的数据, 比如,当向表插入新记录时,在触发程序中可以使用new关键字表示新记录,当需要访问新记录的某个字段值时,可以使用“new.字段名”的方式访问; 2.在 update 触发器中,OLD用来拦截并保存将要或已经修改的原数据,NEW用来拦截并保存将要或已经修改的为新的数据 3.在delete 触发器中,OLD用来拦截并保存将要或者已经被删除的原数据 比如,当从表中删除某条旧记录时,在触发程序中可以使用OLD关键字表示旧记录,当需要访问旧记录的某个字段值时,可以使用“old.字段名”的方式访问。 特别的,new.字段的值可以在before类型的触发器中进行赋值和取值,在after类型触发器中只能取值;