触发器使用

触发器使用

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类型触发器中只能取值;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值