mysql 触发器(trigger)的妙用

mysql用触发器来做适配器,适配系统版本升级

今天在工作中遇到这么一个问题,某客户使用的系统版本不是最新的,出现很多大问题,就考虑升级版本,升级了前后端版本后,数据库的表结构,第三方调用的接口等没办法完全升级。
比如第三方接口调业务回调接口时,给的支付方式(其中一个字段)值是4,但是新版本的是7,如果去让第三方改接口参数,要么不知道当时的开发者,要么要走很多流程。
这个时候灵机一动,可以用触发器啊,在插入业务端的支付记录的时候,将这个字段更新才了,不是很完美吗。

创建触发器基本语法

CREATE <触发器名> < BEFORE | AFTER >
<INSERT | UPDATE | DELETE >
ON <表名> FOR EACH Row<触发器主体>

实现思路一

最开始想的是,用mysql的(计划任务)定时任务啊,每隔1分钟就去批量更新paymode=4的值,更改为7。

update t_d_payrecords set paymode=7 where paymode=4;

然后将这个sql保存成查询,并添加到定时任务里。后面想着这种表记录多,除了延时问题,还会有死锁的风险,咱不能这么low。。
换个思路吧。

实现思路一

逻辑肯定是这样的 在插入支付记录 ,更改新某个字段

DROP TRIGGER IF EXISTS `wx_pay_update_paymodel`; 
create trigger wx_pay_update_paymodel 
after insert on t_d_payrecords for each row 
begin 
 update t_d_payrecords set  paymode = 7
 where paymode = 4;  
end;

创建触发器可以成功,单吃插入支付流水后报错了,尴尬。
错误类容

Can't update table 't_d_payrecords' in stored function/trigger 
because it is already used by statement which invoked this stored function/trigger.

花了几分钟查找资料才发现 这样可能会导致死循环,被mysql机制屏蔽了,也就是插入记录都不会成功。

那换一种思路吧 !

实现思路二

既然先插入再更新值,你会有陷入死循环的风险,那咱就在插入前改变这个字段的值吧

drop trigger wx_pay_update_paymodel;
CREATE TRIGGER wx_pay_update_paymodel 
 BEFORE Insert ON t_d_payrecords
 FOR EACH ROW
 BEGIN IF NEW.paymode='4' THEN SET NEW.paymode = '7';
 END IF;
END;

执行报错,我知道原因,因为一条sql语句默认是;表示结束,但是实际没执行完sql,必然报错。
使用关键字 DELIMITER 表达式,意思就是申明结束标识,遇到结束标识才判断结束。

继续改!

 drop trigger wx_pay_update_paymodel;
 DELIMITER //
CREATE TRIGGER wx_pay_update_paymodel 
 BEFORE Insert ON t_d_payrecords

 FOR EACH ROW

 BEGIN IF NEW.paymode='4' THEN SET NEW.paymode = '7';

 END IF;
END;
 // 

执行成功 ,插入数据时效果也达到了。
搞定收工!

总结

这次遇到的虽然简单,但是也是一种很高效,风险小的思路。
但是要考虑的就是系统移植,问题排查的困难,大部分人都不喜欢用sql的触发器,所以排查问题是,估计很少人会想到明明插入的是4怎么是7 为什么是7!!! 哈哈哈

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值