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

61次阅读
没有评论

共计 4129 个字符,预计需要花费 11 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 mysql 触发器之创建多个触发器操作的示例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

这次记录的内容 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
 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 触发器之创建多个触发器操作的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计4129字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)