时间:2021-07-01 10:21:17 帮助过:31人阅读
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.