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

mysql 触发器的使用(慎用)

发布时间:2022-10-19 15:02:35 所属栏目: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`;

5. 更多

请参看官方文档

(编辑:威海站长网)

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