香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > MYSQL >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2020-11-03 13:44 作者:admin


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

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

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

FOLLOWS选项允许新触发器在现有触发器之后激活。 PRECEDES选项允许新触发器在现有触发器之前激活。

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

DELIMITER $$CREATE TRIGGER trigger_name[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_nameFOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_nameBEGIN…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 productsSET msrp = 95.1WHERE 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_updateBEGIN  INSERT INTO user_change_logs(product_code,updated_by)  VALUES(old.productCode,user());END$$DELIMITER ;

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

UPDATE productsSET msrp = 95.3WHERE 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 setmysql> 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_orderFROM  information_schema.triggersWHERE  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数据库计有所帮助。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)