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.
推荐阅读
-
Triggers — MySQL 5.6 and 5.7_MySQL
-
在win7 64位 上配置apache2.4 mysql5.6 php5.5 .13_MySQL
-
CentOS 7下源码安装MySQL 5.6
-
Oracle Database 11g & MySQL 5.6开发手册
-
MySQL5.6基本优化配置_MySQL
-
Windows 安装并配置 MySQL 5.6
-
用Jersey构建RESTful服务5-Jersey+MySQL5.6+Hibernate4.3
-
MySQL5.6如何优化慢查询的SQL语句--慢日志介绍_MySQL
-
Canal BinlogChange(mysql5.6)
-
Canal BinlogChange(mysql5.6)