mysql 触发器的使用(慎用)

  【前言】最近有一个需求,店铺积分统计,每生成一条积分消费(赠送)日志记录,对应的店铺增加对应的剩余总积分和消费总积分,想了想觉得 mysql 触发器不错,然后尝试写了一个。注意,触发器基于诸多原因,请慎用或不用。

至于相关原因,请自行百度 触发器的弊端。


1. 表结构准备

表1 日志表 字段1 ID 字段2 使用类型(1增加2消费) 字段3 积分数 字段4 店铺ID 字段5 时间戳
score_log id score_type score_num shop_id create_at

表2 店铺积分总表 字段1 ID 字段2 店铺ID 字段3 店铺剩余可用积分 字段4 店铺已消费总积分
shop_score id shop_id left_score use_score


2. 需求说明

的每生成一条 score_log 日志记录 

1)如果 shop_score 中存在shop_id 为新score_log 日志中的shop_id  那接下来更新

      如果不存在 则先插入一条 shop_id 为新score_log 日志中的shop_id 其他值为0 的初始记录 然后再更新

2) 更新规则

     1> score_log 中 使用为消费类型 score_type = 2 

      shop_score 中 left_score = left_score - score_log.score_num

                              use_score = use_score +  score_log.score_num

      2> score_log 中 使用为赠送类型 score_type = 1 

      shop_score 中 left_score = left_score + score_log.score_num

    

3. 知识 储备

1)触发器的使用

# 增加触发器
DELIMITER $$

CREATE
    TRIGGER `数据库名`.`触发器名` BEFORE | AFTER     INSERT/UPDATE/DELETE
    ON `dba`.`score_log`
    FOR EACH ROW BEGIN

   # 这里加入逻辑代码
    
    END$$

DELIMITER ;
#删除触发器

DROP TRIGGER `触发器名`;

【注意】mysql 触发器对应每张表 仅能添加一个触发器  且 INSERT 中仅能使用 NEW 关键字 UPDATE 可以使用 NEW|OLD  DELETE 可以使用 OLD 代替 表名 获取相应的数据


4. 实现上述需求


DELIMITER $$

CREATE
    TRIGGER `dba`.`triggerA` AFTER INSERT
    ON `dba`.`score_log`
    FOR EACH ROW BEGIN

    IF NOT EXISTS(SELECT id FROM shop_score WHERE shop_score.shop_id = new.shop_id) THEN
    INSERT INTO shop_score(shop_id) VALUES(NEW.shop_id);
    END IF;     

    IF new.score_type = 1 THEN
    UPDATE shop_score SET left_score = left_score + new.score_num WHERE shop_score.shop_id  = new.shop_id;
    END IF; 

    IF new.score_type = 2 THEN
    UPDATE shop_score SET left_score = left_score - new.score_num WHERE shop_score.shop_id  = new.shop_id;
    UPDATE shop_score SET use_score = use_score + new.score_num WHERE shop_score.shop_id  = new.shop_id;
    END IF;
    
    END$$

DELIMITER ;
# 删除触发器
DROP TRIGGER `triggerA`;

5.  更多

请参看官方文档 


你可能感兴趣的:(mysql)