年前有个需求要实现订单的实时统计,经组长提点知道了触发器这个概念。
今天整理一下思路
-
基本语法:
delimiter $$ -- 将分隔符设置为$$(避免sql代码中分隔符冲突)create trigger triggerName -- 创建触发器 (命名)after|before insert|update|delete ON tablename -- 触发条件 监控地点(表)for each row -- 监控内容 (每行)begin -- 开始触发逻辑-- logic code sqlend$$ -- 触发逻辑结束delimiter ; -- 将分隔符改回; -
个人例子:
DELIMITER $$CREATE TRIGGER `cus_afterUpdate_place` afterupdate ON `place_order` FOR EACH ROWBEGIN -- 监控order_status字段更新IF NEW.order_status <> OLD.order_status && new.order_status = 3 THENINSERT INTO cus_statistics VALUES(new.create_bm,new.create_user,new.collect_bm,new.collect_site,1,new.insurance_price,curdate(),NOW()) ON DUPLICATE KEY UPDATE total_num=total_num + 1,insurance_price=insurance_price+new.insurance_price;-- 当有主键冲突 或 唯一索引冲突时 执行后面的 更新操作INSERT INTO gs_statistics VALUES(new.collect_bm,new.collect_site,1,new.insurance_price,curdate(),NOW()) ON DUPLICATE KEY UPDATE total_num=total_num + 1,insurance_price=insurance_price+new.insurance_price;-- 字段数值更新为 本身字段值+监控地点 新字段的值END IF;END$$DELIMITER ; -
语法及注意点:
- 触发器不可以 查询/修改 自己当前这个被触发的表。(若触发器触发 a 表,那么不能有 select * from a 类似的操作)
- before | after
- before 监控数据库操作前触发,可用于更改即将入库(更新)的数据
- after 监控数据库操作之后触发,确保操作成功后,进入后续触发操作
- 定义 使用变量
- declare b int;
select count(*) INTO @b from tab2;或者要写成set @b= (select count(*) from tab2 ) ;
- declare b int;
- 条件语句
- if condition(条件) then
逻辑操作语句else if condition(条件)逻辑操作语句else逻辑操作语句end if
特别注意点:
1、trigger 中不同意返回select出来的结果集
2、欲想通过一个SELECT语句对多个变量赋值。请採用下面语句形式:SELECT id,name INTO @v1,@v2 FROM ...
3、select
into给变量赋值的语法不同意返回多行
4、定义变量时用了@符号,以下引用时也要用上@符号