vlambda博客
学习文章列表

【MySql】一个未设置成功的触发器

触发器是因为计算用户忠诚度才来计算的,上次只是生成了一个中间表,在A表中插入数据的同时会在B表中插入对应的数据,设置了对应的计算规则及触发逻辑。

现在把历史数据都已经处理好了,后面会涉及到另一个问题:总表如何更新。
因为情况比较复杂,总表中的忠诚度的更新分两种情况:更新与不需要更新;总表中的相对忠诚度是需要全量更新的;还会有新增用户,这种我在今天上午给出的建议是每个月新增交易数据,触发器更新中间表的数据,把总表删掉,重新用中间表的数据生成总表中的数据。这个是在更新完之后再删表并进行重新汇总。我的建议是把这个也做成触发器,这样只用在第一个表中插入数据,所有的事情都可以自动完成。

【MySql】一个未设置成功的触发器

这个关联到了另一个问题:一个触发器的使用引发另外一个触发器的问题。我在百度上找了一圈,找到的实例是关于删除的,我这边连示例数据都做好了,就是触发器的语句在执行的时候报错了。现在还不知道是什么原因【其实我对delete这个操作的底层逻辑还不太清楚】。
创建四个表,前两个表有一个字段关联,第二个表中间有个字段可以和第三个和第四个表关联。要实现的目的是:删除第一个表中间的记录,触发器先把第二个表对应的记录删掉,再把第三个和第四个表中与第二个表删除记录关联的记录删掉。

这个业务场景让我想到了十年前的工作内容了。经常是一只股票要从网页删除,我们需要关联找到好多记录进行删除。可能那个时候的数据库是没有触发器的吧,或者是触发器无法实现,因为并不是某个theme_id下的所有的symbol_id全部删除。还有对应的parent_id什么的。

这里把代码记录下:
第一步:创建四个表
create table aa asSELECT merchant_no,merchant_name from v2.transaction_detail_202011 where DATE_FORMAT(trans_time,'%d')=30;
create table bb asSELECT merchant_no,order_no from v2.transaction_detail_202011 where DATE_FORMAT(trans_time,'%d')=30;
create table cc asSELECT order_no,trans_amount from v2.transaction_detail_202011 where DATE_FORMAT(trans_time,'%d')=30;
create table dd asSELECT order_no,trans_time from v2.transaction_detail_202011 where DATE_FORMAT(trans_time,'%d')=30;
第二步:写触发器
DELIMITER $CREATE trigger aabb_delete on aa for delete as begindelete bb where merchant_no in (select merchant_no from deleted);End$CREATE trigger bbcd_delete on bbfor delete as begindelete cc where order_no in (select order_no from deleted);delete dd where order_no in (select order_no from deleted);End$DELIMITER ;
报错记录:
CREATE trigger aabb_delete on aa for delete as begindelete bb where merchant_no in (select merchant_no from deleted);End> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'on aa  for delete  as  begin delete bb where merchant_no in (select merchant' at line 2> 时间: 0s

这个问题只能留着以后再来研究了。先mark一下!