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

这里写自定义目录标题

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

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

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

创建触发器基本语法

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

实现思路一

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

复制代码
1
2
update t_d_payrecords set paymode=7 where paymode=4;

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

实现思路一

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

复制代码
1
2
3
4
5
6
7
8
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;

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

复制代码
1
2
3
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机制屏蔽了,也就是插入记录都不会成功。

那换一种思路吧 !

实现思路二

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

复制代码
1
2
3
4
5
6
7
8
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 表达式,意思就是申明结束标识,遇到结束标识才判断结束。

继续改!

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部