zoukankan      html  css  js  c++  java
  • Mysql触发器简明使用

    触发器:trigger
    创建触发器的语法
    mysql> delimiter $
    mysql> create trigger 触发器名称
    after/before(触发时间)
    insert/update/delete(监视事件)
    on 表名(临视地址)
    for each row
    begin
    sql1;
    ...
    sqlN;
    end$
    mysql> delimiter ;

    查看已有trigger: show trigger;
    删除已有trigger: drop trigger 触发器名称


    1.
    表结构:
    商品表:goods
    订单表:ord
    需求:
    当下1个订单时,对应的商品要相应减少(买几个商品就少几个商品)
    分析:
    监视谁:ord
    临视动作:insert
    触发时间:之后
    触发事件:update
    语法:
    create trigger t1
    after
    insert
    on ord
    for each row
    begin
    update goods xxxx
    end;

     1 create table goods(
     2     gid int,
     3     name varchar(20),
     4     num int
     5 );
     6 create table ord(
     7     oid int,
     8     ggid int,
     9     muth int
    10 );
    11 
    12 insert into goods values
    13 (1,'cat',34),
    14 (1,'dog',86),
    15 (1,'pig',12);
    16 
    17 //添加时候
    18 create trigger t1
    19 after
    20 insert
    21 on ord
    22 for each row
    23 begin
    24 update goods set num=num-new.muth where gid=new.ggid;
    25 end;
    26 
    27 //删除时候
    28 create trigger t2
    29 after
    30 delete
    31 on ord
    32 for each row
    33 begin
    34 update goods set num=num+old.muth where gid=old.ggid;
    35 end;
    36 
    37 //修改时候
    38 create trigger t3
    39 before
    40 update
    41 on ord
    42 for each row
    43 begin
    44 update goods set num=num+old.muth-new.muth where gid=old.ggid;
    45 //或写成:update goods set num=num+old.muth-new.muth where gid=new.ggid;
    46 end;
    47 
    48 # 如果购买量muth > 库存量num时,把muth自动改为num
    49 
    50 create trigger t4
    51 before
    52 insert
    53 on ord
    54 for each row
    55 begin
    56 # 申明变量
    57 declare
    58 rnum int;
    59 # 判断
    60 select num into rnum from goods where gid=new.ggid;
    61 if new.muth > rnum then 
    62     set new.muth=rnum;
    63 end if;
    64 
    65 update goods set num=num+old.muth-new.muth where gid=old.ggid;
    66 end;

     例2:添加数据,触发别一个统计表,如存在就插入统计记录,如统计记录中有插入过就修改

     1 create trigger 触发器名称
     2 before
     3 insert
     4 on 触发的表
     5 for each row
     6 begin
     7 declare
     8 resNum int;
     9 select count(*) into resNum from 表名A where projectID=new.projectID and addDate=CURDATE();
    10 if resNum=0 then
    11     insert into 表名A (projectID,addDate,gtotal,stotal) values(new.projectID,CURDATE(),1,1);
    12 else
    13     update 表名A set gtotal=gtotal+1,stotal=stotal+1 where projectID=new.projectID and addDate=CURDATE();
    14 end if;
    15 end;

    例:
    插入

    DELIMITER $$
    
    USE `super`$$
    
    DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount`$$
    
    CREATE
        TRIGGER `wu_autocount` BEFORE INSERT ON `gbook_data` 
        FOR EACH ROW BEGIN
    DECLARE resNum INT;
    DECLARE nums INT;
    
    IF new.status='1' THEN
    SET nums=1;
    ELSE
    SET nums=0;
    END IF;
    SELECT COUNT(*) INTO resNum FROM gbook_autocount WHERE projectID=new.projectID AND ADDDATE=CURDATE();
    IF resNum=0 THEN
        INSERT INTO gbook_autocount (projectID,ADDDATE,gtotal,stotal) VALUES(new.projectID,CURDATE(),1,nums);
    ELSE
        UPDATE gbook_autocount SET gtotal=gtotal+1,stotal=stotal+nums WHERE projectID=new.projectID AND ADDDATE=CURDATE();
    END IF;
    END;
    $$
    
    DELIMITER ;
    删除:
    DELIMITER $$
    
    USE `super`$$
    
    DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount_del`$$
    
    CREATE
        TRIGGER `wu_autocount_del` AFTER DELETE ON `gbook_data` 
        FOR EACH ROW BEGIN
        DECLARE num INT;
        SELECT gtotal INTO num FROM super.`gbook_autocount` WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
        IF num<=1 THEN
        DELETE FROM super.`gbook_autocount` WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
        ELSE
        IF old.status!='1' THEN
        UPDATE super.`gbook_autocount` SET gtotal=gtotal-1 WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
        ELSE
        UPDATE super.`gbook_autocount` SET gtotal=gtotal-1,stotal=stotal-1 WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
        END IF;
        END IF;
        END;
    $$
    
    DELIMITER ;
    
    
    更新:
    DELIMITER $$
    
    USE `super`$$
    
    DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount_update`$$
    
    CREATE
        TRIGGER `wu_autocount_update` BEFORE UPDATE ON `gbook_data` 
        FOR EACH ROW BEGIN
    IF new.status!=old.status THEN
        IF new.status!='1' && old.status='1' THEN
            UPDATE gbook_autocount SET stotal=stotal-1 WHERE projectID=new.projectID AND ADDDATE=old.ADDDATE;
        ELSEIF new.status='1' && old.status!='1' THEN
            UPDATE gbook_autocount SET stotal=stotal+1 WHERE projectID=new.projectID AND ADDDATE=old.ADDDATE;
        END IF;
    END IF;
    END;
    $$
    
    DELIMITER ;
  • 相关阅读:
    校验字符的表达式
    校验数字的表达式
    Html和xhtml有什么区别
    VUE3.0 + TS 项目实战 (2)基本写法
    VUE3.0 + TS 项目实战 (1)初始化项目
    props传递函数以及$emit触发父组件方法
    rollup
    js函数式编程
    移动端双击事件
    JS节流与防抖
  • 原文地址:https://www.cnblogs.com/ahwu/p/3615308.html
Copyright © 2011-2022 走看看