• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    mysql触发器之创建多个触发器操作实例分析

    本文实例讲述了mysql触发器之创建多个触发器操作。分享给大家供大家参考,具体如下:

    这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。

    在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器。 mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器。当事件发生时,触发器将依次激活。我们来参考创建第一个触发器中的语法。如果表中有相同事件有多个触发器,mysql 将按照创建的顺序调用触发器。要更改触发器的顺序,需要在FOR EACH ROW子句之后指定FOLLOWS或PRECEDES。我们来看下这两个词的说明:

    完事来看下使用显式顺序创建新的附加触发器的语法:

    DELIMITER $$
    CREATE TRIGGER trigger_name
    [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name
    FOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_name
    BEGIN
    …
    END$$
    DELIMITER ;
    
    

    然后,我们来看一个在表中的同一个事件和动作上,创建多个触发器的例子。我们来基于products表进行演示,首先来创建一个新的price_logs表,完事呢,每当更改产品的价格(MSRP列)时,要将旧的价格记录在一个名为price_logs的表中,先来看想sql:

    CREATE TABLE price_logs (
     id INT(11) NOT NULL AUTO_INCREMENT,
     product_code VARCHAR(15) NOT NULL,
     price DOUBLE NOT NULL,
     updated_at TIMESTAMP NOT NULL DEFAULT 
           CURRENT_TIMESTAMP 
           ON UPDATE CURRENT_TIMESTAMP,
     PRIMARY KEY (id),
     KEY product_code (product_code),
     CONSTRAINT price_logs_ibfk_1 FOREIGN KEY (product_code) 
     REFERENCES products (productCode) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE
    );
    
    

    完事,当表的BEFORE UPDATE事件发生时,创建一个新的触发器。触发器名称为before_products_update,具体实现如下所示:

    DELIMITER $$
    CREATE TRIGGER before_products_update 
      BEFORE UPDATE ON products 
      FOR EACH ROW 
    BEGIN
       INSERT INTO price_logs(product_code,price)
       VALUES(old.productCode,old.msrp);
    END$$
    DELIMITER ;
    
    

    然后,当我们更改产品的价格,并使用以下update语句,最后查询price_logs表:

    UPDATE products
    SET msrp = 95.1
    WHERE productCode = 'S10_1678';
    -- 查询结果价格记录
    SELECT * FROM price_logs;
    
    

    上面查询语句执行后,得到以下结果:

    +----+--------------+-------+---------------------+
    | id | product_code | price | updated_at     |
    +----+--------------+-------+---------------------+
    | 1 | S10_1678   | 95.7 | 2017-08-03 02:46:42 |
    +----+--------------+-------+---------------------+
    1 row in set
    
    

    可以看到结果中,它按我们预期那样工作了。

    完事我们再来假设不仅要看到旧的价格,改变的时候,还要记录是谁修改了它。要实现这个,我们可以向price_logs表添加其他列,但是,为了实现多个触发器的演示,我们将创建一个新表来存储进行更改的用户的数据。这个新表的名称为user_change_logs,结构如下:

    CREATE TABLE user_change_logs (
     id int(11) NOT NULL AUTO_INCREMENT,
     product_code varchar(15) DEFAULT NULL,
     updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
     ON UPDATE CURRENT_TIMESTAMP,
     updated_by varchar(30) NOT NULL,
     PRIMARY KEY (id),
     KEY product_code (product_code),
     CONSTRAINT user_change_logs_ibfk_1 FOREIGN KEY (product_code) 
     REFERENCES products (productCode) 
     ON DELETE CASCADE ON UPDATE CASCADE
    );
    
    

    现在,我们创建一个在products表上的BEFORE UPDATE事件上激活的第二个触发器。 此触发器将更改的用户信息更新到user_change_logs表。 它在before_products_update触发后被激活:

    DELIMITER $$
    CREATE TRIGGER before_products_update_2 
      BEFORE UPDATE ON products 
      FOR EACH ROW FOLLOWS before_products_update
    BEGIN
      INSERT INTO user_change_logs(product_code,updated_by)
      VALUES(old.productCode,user());
    END$$
    DELIMITER ;
    
    

    然后我们来使用update语句更新指定产品的价格:

    UPDATE products
    SET msrp = 95.3
    WHERE productCode = 'S10_1678';
    
    

    再来分别从price_logs和user_change_logs表查询数据:

    mysql> SELECT * FROM price_logs;
    +----+--------------+-------+---------------------+
    | id | product_code | price | updated_at     |
    +----+--------------+-------+---------------------+
    | 1 | S10_1678   | 95.7 | 2017-08-03 02:46:42 |
    | 2 | S10_1678   | 95.1 | 2017-08-03 02:47:21 |
    +----+--------------+-------+---------------------+
    2 rows in set
    mysql> SELECT * FROM user_change_logs;
    +----+--------------+---------------------+----------------+
    | id | product_code | updated_at     | updated_by   |
    +----+--------------+---------------------+----------------+
    | 1 | S10_1678   | 2017-08-03 02:47:21 | root@localhost |
    +----+--------------+---------------------+----------------+
    1 row in set
    
    

    如上所见,两个触发器按照预期的顺序激活执行相关操作了。完事我们来在information_schema数据库的triggers表中的action_order列,看下触发激活同一事件和操作的顺序:

    mysql> SELECT 
      trigger_name, action_order
    FROM
      information_schema.triggers
    WHERE
      trigger_schema = 'yiibaidb'
    ORDER BY event_object_table , 
         action_timing , 
         event_manipulation;
    +--------------------------+--------------+
    | trigger_name       | action_order |
    +--------------------------+--------------+
    | before_employee_update  |      1 |
    | before_products_update  |      1 |
    | before_products_update_2 |      2 |
    +--------------------------+--------------+
    3 rows in set
    
    

    好啦,本次记录就到这里了。

    更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

    希望本文所述对大家MySQL数据库计有所帮助。

    您可能感兴趣的文章:
    • MySQL触发器的使用场景及方法实例
    • mysql触发器原理与用法实例分析
    • MySQL 触发器定义与用法简单实例
    • mysql 触发器用法实例详解
    • MySQL通过触发器解决数据库中表的行数限制详解及实例
    • MySQL 触发器详解及简单实例
    • MySQL触发器运用于迁移和同步数据的实例教程
    • mysql触发器(Trigger)简明总结和使用实例
    • MySQL中触发器入门简单实例与介绍
    • mysql触发器trigger实例详解
    上一篇:mysql触发器之创建使用触发器简单示例
    下一篇:MySQL索引长度限制原理解析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    mysql触发器之创建多个触发器操作实例分析 mysql,触发器,之,创建,多个,