mysql 触发器trigger

  年前有个需求要实现订单的实时统计,经组长提点知道了触发器这个概念。

  今天整理一下思路

  

  1. 基本语法:

    delimiter $$ -- 将分隔符设置为$$(避免sql代码中分隔符冲突)
    create trigger triggerName -- 创建触发器 (命名)
    after|before insert|update|delete ON tablename -- 触发条件 监控地点(表)
    for each row -- 监控内容 (每行)
    begin -- 开始触发逻辑
    -- logic code sql
    end$$ -- 触发逻辑结束
    delimiter ; -- 将分隔符改回;
  2. 个人例子:

    DELIMITER $$
    CREATE TRIGGER `cus_afterUpdate_place` after
    update ON `place_order` FOR EACH ROW
    BEGIN -- 监控order_status字段更新
    IF NEW.order_status <> OLD.order_status && new.order_status = 3 THEN
    INSERT 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 ;
  3. 语法及注意点:

    1. 触发器不可以 查询/修改 自己当前这个被触发的表。(若触发器触发 a 表,那么不能有 select * from a 类似的操作)
    2. before | after
      1. before 监控数据库操作前触发,可用于更改即将入库(更新)的数据
      2. after 监控数据库操作之后触发,确保操作成功后,进入后续触发操作
      3. 定义 使用变量
        1. declare b int;
          select count(*) INTO @b from tab2;
          或者要写成
          set @b= (select count(*) from tab2 ) ;
      4. 条件语句
          1. 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、定义变量时用了@符号,以下引用时也要用上@符号

posted on 2018-06-08 10:17  殊珠子  阅读(198)  评论(0编辑  收藏  举报

导航