zoukankan      html  css  js  c++  java
  • MYSQL-触发器

    1、触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL。


    创建触发器

    语法如下:

    CREATE TRIGGER trigger_name trigger_time trigger_event
        ON tbl_name FOR EACH ROW trigger_stmt
    BEGIN
    SQL;
    END$

    触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

    触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。

    trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

    trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

      ·     NSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

      ·     UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

      ·     DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

      .......

      废话不多说,直接上代码和效果:(核心知识:只要是被insert、update或者delete的那一列,那么该列所有字段都可以使用【new.字段名】来表示)

    2、insert类触发器

    复制代码
    DROP TABLE if EXISTS account;
    CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2),NUM INT );
    
    CREATE TRIGGER ins_sum AFTER INSERT ON account FOR EACH ROW 
    UPDATE 
      employee
    SET
      Age = new.acct_num + 1 
    WHERE ID = new.acct_num ;
    
    INSERT INTO account(acct_num,amount) VALUES(1,2.00);
    SELECT * FROM employee
    复制代码

     实例二:2018/11/23日,新增 --- (避免使用事物,可以使用这种触发器【分别创建 新建触发器和更改触发器,删除是软删除,包含在更新里面 】)

    复制代码
    DROP TRIGGER if EXISTS cmf_book_class_num_insert;
    CREATE TRIGGER cmf_book_class_num_insert AFTER INSERT ON cmf_book_class_log FOR EACH ROW 
    BEGIN
        UPDATE cmf_book_class SET total_num = (
            SELECT SUM(cmf_book_class_log.num) FROM cmf_book_class_log
            WHERE cmf_book_class_log.delete_time is null 
            AND cmf_book_class_log.class_id=new.class_id
                    AND cmf_book_class_log.book_id=new.book_id
        ) WHERE class_id=new.class_id AND book_id=new.book_id AND delete_time is NULL;
    END
    复制代码

    主表结构:

    从表结构:

    3、update类触发器:ims_shopping_goods_option 商品规格从表,ims_shopping_goods 商品主表。 -- 逻辑关系:主表的商品id==从表goodsid。

     目的:实时监控主表商品的库存night_num值。

    //建表

    复制代码
    CREATE TABLE `ims_shopping_goods` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `is_nightpay` tinyint(1) DEFAULT '0' COMMENT '是否参加午夜订购专区',
      `night_num` int(11) DEFAULT NULL COMMENT '午夜订购库存',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=438 DEFAULT CHARSET=utf8;
    复制代码
    复制代码
    CREATE TABLE `ims_shopping_goods_option` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `goodsid` int(10) DEFAULT '0',
      `erp_oid` int(11) NOT NULL DEFAULT '0' COMMENT 'erp2规格id',
      `is_nightpay` tinyint(3) DEFAULT '0' COMMENT '是否参加午夜订购专区',
      `night_num` int(11) DEFAULT '0' COMMENT '午夜订购库存',
      PRIMARY KEY (`id`),
      KEY `indx_goodsid` (`goodsid`),
    ) ENGINE=MyISAM AUTO_INCREMENT=1178 DEFAULT CHARSET=utf8;
    复制代码

    //创建触发器

    复制代码
    DROP TRIGGER if EXISTS ins_night_num;  ## 删除触发器
    CREATE TRIGGER ins_night_num AFTER UPDATE ON ims_shopping_goods_option FOR EACH ROW 
    BEGIN
        UPDATE ims_shopping_goods SET night_num = (
            SELECT SUM(ims_shopping_goods_option.night_num) FROM ims_shopping_goods_option
            WHERE ims_shopping_goods_option.is_nightpay=1 
            AND ims_shopping_goods_option.goodsid=new.goodsid
        ) WHERE id=new.goodsid AND is_nightpay=1;
    END
    
    ###测试触发器效果 UPDATE ims_shopping_goods_option SET night_num= 8 WHERE id=1175; SELECT id,is_nightpay,night_num FROM ims_shopping_goods WHERE id=436;
    复制代码
  • 相关阅读:
    【iOS开发-从网络上获取图片尺寸】
    【iOS开发之静态库、动态库】
    【iOS开发之OC和JS互调】
    【iOS之runtime、runloop】
    【iOS开发之C语言】sprintf,strncpy,strcmp三个函数的区别
    计算机中的存储单位
    linux命令行
    python的安装
    Java的跨平台特性
    方法的重写(override)两同两小一大原则:
  • 原文地址:https://www.cnblogs.com/zgxblog/p/13408478.html
Copyright © 2011-2022 走看看