Triggers — MySQL 5.6 and 5.7_MySQL
So what is a trigger? Triggers run eitherBEFOREorAFTERanUPDATE,DELETE, orINSERTis performed. You also get access to theOLD.col_nameandNEW.col_namevariables for the previous value and the newer value of the column.
So how do you use a trigger? Let say you are updating the price of an inventory item in a product database with a simple UPDATE statement. But you also want to track when the price change and the old price.
The table for products.CREATE TABLE products (id INT NOT NULL auto_increment,
price DECIMAL(5,2) NOT NULL,
PRIMARY KEY (id));
The table for price changes on the product table.CREATE TABLE products_log (id INT NOT NULL,
price DECIMAL(5,2) NOT NULL,
change_date timestamp);
Now to define a trigger that will log price changes. We do this when a price is updated. Now the use od OLD.price to avoid confusion between the old price or the new price being saved in the log.DELIMITER |
CREATE TRIGGER product_price_logger
BEFORE UPDATE ON products
FOR EACH row
BEGIN
INSERT INTO products_log (id, price)
VALUES (id, OLD.PRICE);
END
|
DELIMITER ;
Add in some data.INSERT INTO products (price) VALUES (1.10),(2.24),(.99),(.01),(.34);
So UPDATE a record.UPDATE products SET price='1.11' WHERE ID = 1;
So did it work? Yes, and no. RunningSELECT * FROM products_log;
Provides us with a time stamp of the change and the OLD.price. But I forgot to also record the id!!Challenge: Correct my mistake and compare it to an update I will make in a few days.
Now 5.7 introduces multiple triggers for the same event. Lets add yet another log this time recording who made the change;
The ‘who made the change table’.CREATE table who_changed (
id INT NOT NULL,
who_did_it CHAR(30) NOT NULL,
when_did_it TIMESTAMP);
And the second trigger.DELIMITER |
CREATE TRIGGER product_price_whom
BEFORE UPDATE ON products
FOR EACH ROW
FOLLOWS product_price_logger
BEGIN
INSERT INTO who_changed (id, who_did_it)
VALUES (OLD.id, user());
END
|
DELIMITER ;
SoUPDATE products SET price='19.99' WHERE id=4;
is run and we see that both triggers execute. Note thatSHOW TRIGGERS fromschema;does not provide any information on trigger order. But you can find all that asaction_orderinPERFORMANCE_SCHEMA.TRIGGERS
Being able to order triggers makes it easy to make logical steps when processing data. Can you get into trouble with this? I am certain someone will manage to make a mess with this. But I think most of us will enjoy being able to use this great new functionality.
推荐阅读
-
Apache2.4+PHP5.6+MySQL5.6整合配置
-
Galera 3.5 for Percona XtraDB Cluster 5.6 is now available_MySQL
-
Galera 3.5 for Percona XtraDB Cluster 5.6 is now available_MySQL
-
mysql5.6 基于GTID及多线程复制详解
-
MySQL5.6下windows msi安装详细介绍
-
windows下安装、卸载mysql服务的方法(mysql 5.6 zip解压版安装教程)
-
mysql5.6安装配置方法图文教程
-
mysql5.6 主从复制同步详细配置(图文)_MySQL
-
mysql5.6乱码
-
生产库自动化MySQL5.6安装部署详细教程