mysql触发器之创建多个触发器操作实例分析
本文实例讲述了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_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数据库计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程