各位用户为了找寻关于mysql触发器之创建多个触发器操作实例分析的资料费劲了很多周折。这里教程网为您整理了关于mysql触发器之创建多个触发器操作实例分析的相关资料,仅供查阅,以下为您介绍关于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选项允许新触发器在现有触发器之前激活。完事来看下使用显式顺序创建新的附加触发器的语法:
? 1 2 3 4 5 6 7 8DELIMITER $$
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:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14CREATE
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,具体实现如下所示:
? 1 2 3 4 5 6 7 8 9DELIMITER $$
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表:
? 1 2 3 4 5UPDATE
products
SET
msrp = 95.1
WHERE
productCode =
'S10_1678'
;
-- 查询结果价格记录
SELECT
*
FROM
price_logs;
上面查询语句执行后,得到以下结果:
? 1 2 3 4 5 6+
----+--------------+-------+---------------------+
| 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,结构如下:
? 1 2 3 4 5 6 7 8 9 10 11 12CREATE
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触发后被激活:
? 1 2 3 4 5 6 7 8 9DELIMITER $$
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语句更新指定产品的价格:
? 1 2 3UPDATE
products
SET
msrp = 95.3
WHERE
productCode =
'S10_1678'
;
再来分别从price_logs和user_change_logs表查询数据:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15mysql>
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列,看下触发激活同一事件和操作的顺序:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17mysql>
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数据库计有所帮助。
原文链接:https://blog.csdn.net/luyaran/article/details/81028797