標籤:NEW.COLUMN,OLDCOLUMNmysql
文章內容主要講述的是insert,update,delete觸發器,若是以前有使用其它產品數據庫產品仍是有的地方須要注意,例如sqlserver使用inserted獲取新插入的值,而mysql是使用NEW.COLUMN來獲取。sql
只能對永久表建立觸發器,不能在臨時表中建立觸發器;同一個表不能存在兩個相同類型的觸發器,例如不能存在兩個insert觸發器,對應update觸發器能夠經過IF 不一樣的字段執行不同的操做。數據庫
當前測試版本:mysql 5.6.21。sqlserver
目錄測試
#產品表 CREATE TABLE Product (proID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '商品表主鍵', price DECIMAL(10,2) NOT NULL COMMENT '商品價格', type INT NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)', dtime DATETIME NOT NULL COMMENT '建立時間' )AUTO_INCREMENT=1 COMMENT='商品表'; #商品類別彙總表 CREATE TABLE ProductType (ID INT NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)', amount INT NOT NULL COMMENT '每種類別商品總金額', PRIMARY KEY (ID) )COMMENT='商品類別資金彙總表'; #產品價格變更表 CREATE TABLE Product_log (ID INT AUTO_INCREMENT NOT NULL COMMENT '主鍵', productid INT NOT NULL COMMENT '產品id', newprice DECIMAL(10,2) COMMENT '更改後的價格', oldprice DECIMAL(10,2) COMMENT '更改前的價格', PRIMARY KEY(ID) )AUTO_INCREMENT=1 COMMENT='產品價格變更表'; #插入測試數據 INSERT INTO ProductType VALUES(1,0.00),(2,0.00),(3,0.00);
insert觸發器只有NEW.Column.spa
在Product表中創建INSERT觸發器,當往Product表中插入產品時,更新ProductType表對應的分類商品價格。3d
DELIMITER $$ CREATE TRIGGER TR_Product_insert AFTER INSERT ON Product FOR EACH ROW BEGIN UPDATE ProductType SET amount=amount+NEW.price WHERE ID=NEW.type; END $$ DELIMITER ;
插入測試數據日誌
INSERT INTO Product(price,type,dtime) VALUES(10.00,1,NOW()),(10.00,1,NOW()),(10.00,2,NOW()),(10.00,3,NOW()); SELECT * FROM Product; SELECT * FROM ProductType;
update觸發器中NEW.column表明更新後的值,OLD.column表明更新前的值。code
#UPDATE觸發器 DELIMITER $$ CREATE TRIGGER TR_Product_updat AFTER UPDATE ON Product FOR EACH ROW BEGIN IF NEW.price<>OLD.price THEN#當價格發生變化時生成一條價格變更的日誌信息插入Product_log表 INSERT INTO Product_log(productid,newprice,oldprice) VALUES(NEW.proID,NEW.price,OLD.price); ELSE IF NEW.type<>OLD.type THEN#當產品類型發生改變時更新ProductType表對應的類別 UPDATE ProductType SET amount=amount+(SELECT price FROM Product WHERE proID=NEW.proid) WHERE ID=NEW.type; UPDATE ProductType SET amount=amount-(SELECT price FROM Product WHERE proID=NEW.proid) WHERE ID=OLD.type; END IF; END IF; END $$ DELIMITER ;
測試數據server
UPDATE Product SET price=40.00 WHERE proid=4;
UPDATE Product SET type=2 WHERE proid=4;
DELIMITER $$ CREATE TRIGGER TR_product_delete BEFORE DELETE ON product FOR EACH row BEGIN UPDATE producttype SET amount=amount-(SELECT price FROM product WHERE proID=OLD.proID) WHERE ID=OLD.type; END $$ DELIMITER ;
測試數據
DELETE FROM product WHERE proID=4;
完善語句
#NEW.Column:獲取新插入的列值,OLD.column:獲取更新列的舊值 #產品表 CREATE TABLE Product (proID INT AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT '商品表主鍵', price DECIMAL(10,2) NOT NULL COMMENT '商品價格', type INT NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)', dtime DATETIME NOT NULL COMMENT '建立時間' )AUTO_INCREMENT=1 COMMENT='商品表'; #商品類別彙總表 CREATE TABLE ProductType (ID INT NOT NULL COMMENT '商品類別(0生鮮,1食品,2生活)', amount INT NOT NULL COMMENT '每種類別商品總金額', PRIMARY KEY (ID) )COMMENT='商品類別資金彙總表'; #產品價格變更表 CREATE TABLE Product_log (ID INT AUTO_INCREMENT NOT NULL COMMENT '主鍵', productid INT NOT NULL COMMENT '產品id', newprice DECIMAL(10,2) NOT NULL COMMENT '更改後的價格', oldprice DECIMAL(10,2) NOT NULL COMMENT '更改前的價格', remark VARCHAR(20) NOT NULL COMMENT '價格更改備註', dtime DATETIME NOT NULL DEFAULT current_timestamp COMMENT '記錄插入的時間', PRIMARY KEY(ID) )AUTO_INCREMENT=1 COMMENT='產品價格變更表'; #插入測試數據 INSERT INTO ProductType VALUES(1,0.00),(2,0.00),(3,0.00); DELIMITER $$ CREATE TRIGGER TR_Product_insert AFTER INSERT ON Product FOR EACH ROW BEGIN UPDATE ProductType SET amount=amount+NEW.price WHERE ID=NEW.type; END $$ DELIMITER ; #UPDATE觸發器 DROP TRIGGER IF EXISTS TR_Product_updat; DELIMITER $$ CREATE TRIGGER TR_Product_updat AFTER UPDATE ON Product FOR EACH ROW BEGIN IF NEW.price>OLD.price THEN#當價格發生變化時生成一條價格變更的日誌信息插入Product_log表 INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'加價'); UPDATE ProductType SET amount=amount+NEW.price-OLD.price WHERE ID=NEW.type; ELSE IF NEW.price<OLD.price THEN INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'減價'); UPDATE ProductType SET amount=amount-OLD.price+NEW.price WHERE ID=NEW.type; END IF; END IF; IF NEW.type<>OLD.type THEN#當產品類型發生改變時更新ProductType表對應的類別 INSERT INTO Product_log(productid,newprice,oldprice,remark) VALUES(NEW.proID,NEW.price,OLD.price,'產品類型變動'); UPDATE ProductType SET amount=amount+NEW.price WHERE ID=NEW.type; UPDATE ProductType SET amount=amount-NEW.price WHERE ID=OLD.type; END IF; END $$ DELIMITER ; #DELETE觸發器 DELIMITER $$ CREATE TRIGGER TR_product_delete BEFORE DELETE ON product FOR EACH row BEGIN UPDATE producttype SET amount=amount-(SELECT price FROM product WHERE proID=OLD.proID) WHERE ID=OLD.type; END $$ DELIMITER ; INSERT INTO product(price,type,dtime) VALUES(10.00,1,NOW()),(10.00,1,NOW()),(10.00,1,NOW()),(10.00,2,NOW()),(10.00,3,NOW()),(10.00,4,NOW()); #測試數據 UPDATE product SET price=30 WHERE proID=5; #測試價格變更 UPDATE product SET price=20 WHERE proID=5; #測試產品類型變更 UPDATE product SET type=2 WHERE proID=5;
文章在INSTER和UPDATE觸發器中用的是AFTER方式的觸發,AFTER觸發就是在執行命令操做以後執行觸發操做;在DELETE觸發器中用到的是BEFORE觸發,BEFORE觸發就是在執行操做命令以前執行觸發操做。
文章若是對你們有幫助,請幫忙推薦,謝謝!!!
備註: 做者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。 《歡迎交流討論》 |
---恢復內容結束---