加入收藏 | 设为首页 | 会员中心 | 我要投稿 均轻资讯网_我爱站长网 (https://www.52junqing.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql 触发器的使用

发布时间:2022-10-25 12:58:08 所属栏目:MySql教程 来源:
导读:  【前言】最近有一个需求,店铺积分统计,每生成一条积分消费(赠送)日志记录,对应的店铺增加对应的剩余总积分和消费总积分,想了想觉得 mysql 触发器不错mysql触发器,然后尝试写了一个。注意,触发器基于诸多
  【前言】最近有一个需求,店铺积分统计,每生成一条积分消费(赠送)日志记录,对应的店铺增加对应的剩余总积分和消费总积分,想了想觉得 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`;
 

(编辑:均轻资讯网_我爱站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!