我是靠谱客的博主 文静热狗,最近开发中收集的这篇文章主要介绍mysql 触发器(trigger)的妙用mysql用触发器来做适配器,适配系统版本升级总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这里写自定义目录标题

  • mysql用触发器来做适配器,适配系统版本升级
    • 创建触发器基本语法
    • 实现思路一
    • 实现思路一
    • 实现思路二
  • 总结

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!!! 哈哈哈

最后

以上就是文静热狗为你收集整理的mysql 触发器(trigger)的妙用mysql用触发器来做适配器,适配系统版本升级总结的全部内容,希望文章能够帮你解决mysql 触发器(trigger)的妙用mysql用触发器来做适配器,适配系统版本升级总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(749)

评论列表共有 0 条评论

立即
投稿
返回
顶部