1、觸發器是一個特殊的存儲過程,不同的是存儲過程要用CALL來調用,而觸發器不需要使用CALL。
創建觸發器
語法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
BEGIN
SQL;
END$
觸發程序是與表有關的命名數據庫對象,當表上出現特定事件時,將激活該對象。
觸發程序與命名為tbl_name的表相關。tbl_name必須引用永久性表。不能將觸發程序與臨時表表或視圖關聯起來。
trigger_time是觸發程序的動作時間。它可以是BEFORE或AFTER,以指明觸發程序是在激活它的語句之前或之后觸發。
trigger_event指明了激活觸發程序的語句的類型。trigger_event可以是下述值之一:
· INSERT:將新行插入表時激活觸發程序,例如,通過INSERT、LOAD DATA和REPLACE語句。
· UPDATE:更改某一行時激活觸發程序,例如,通過UPDATE語句。
· DELETE:從表中刪除某一行時激活觸發程序,例如,通過DELETE和REPLACE語句。
.......
廢話不多說,直接上代碼和效果:(核心知識:只要是被insert、update或者delete的那一列,那么該列所有字段都可以使用【new.字段名】來表示)
2、insert類觸發器
DROP TABLE if EXISTS account; CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2),NUM INT ); CREATE TRIGGER ins_sum AFTER INSERT ON account FOR EACH ROW UPDATE employee SET Age = new.acct_num + 1 WHERE ID = new.acct_num ; INSERT INTO account(acct_num,amount) VALUES(1,2.00); SELECT * FROM employee
實例二:2018/11/23日,新增 --- (避免使用事物,可以使用這種觸發器【分別創建 新建觸發器和更改觸發器,刪除是軟刪除,包含在更新里面 】)
DROP TRIGGER if EXISTS cmf_book_class_num_insert;
CREATE TRIGGER cmf_book_class_num_insert AFTER INSERT ON cmf_book_class_log FOR EACH ROW
BEGIN
UPDATE cmf_book_class SET total_num = (
SELECT SUM(cmf_book_class_log.num) FROM cmf_book_class_log
WHERE cmf_book_class_log.delete_time is null
AND cmf_book_class_log.class_id=new.class_id
AND cmf_book_class_log.book_id=new.book_id
) WHERE class_id=new.class_id AND book_id=new.book_id AND delete_time is NULL;
END
主表結構:
從表結構:
3、update類觸發器:ims_shopping_goods_option 商品規格從表,ims_shopping_goods 商品主表。 -- 邏輯關系:主表的商品id==從表goodsid。
目的:實時監控主表商品的庫存night_num值。
//建表
CREATE TABLE `ims_shopping_goods` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `is_nightpay` tinyint(1) DEFAULT '0' COMMENT '是否參加午夜訂購專區', `night_num` int(11) DEFAULT NULL COMMENT '午夜訂購庫存', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=438 DEFAULT CHARSET=utf8;
CREATE TABLE `ims_shopping_goods_option` ( `id` int(11) NOT NULL AUTO_INCREMENT, `goodsid` int(10) DEFAULT '0', `erp_oid` int(11) NOT NULL DEFAULT '0' COMMENT 'erp2規格id', `is_nightpay` tinyint(3) DEFAULT '0' COMMENT '是否參加午夜訂購專區', `night_num` int(11) DEFAULT '0' COMMENT '午夜訂購庫存', PRIMARY KEY (`id`), KEY `indx_goodsid` (`goodsid`), ) ENGINE=MyISAM AUTO_INCREMENT=1178 DEFAULT CHARSET=utf8;
//創建觸發器
DROP TRIGGER if EXISTS ins_night_num; ## 刪除觸發器 CREATE TRIGGER ins_night_num AFTER UPDATE ON ims_shopping_goods_option FOR EACH ROW BEGIN UPDATE ims_shopping_goods SET night_num = ( SELECT SUM(ims_shopping_goods_option.night_num) FROM ims_shopping_goods_option WHERE ims_shopping_goods_option.is_nightpay=1 AND ims_shopping_goods_option.goodsid=new.goodsid ) WHERE id=new.goodsid AND is_nightpay=1; END
###測試觸發器效果 UPDATE ims_shopping_goods_option SET night_num= 8 WHERE id=1175; SELECT id,is_nightpay,night_num FROM ims_shopping_goods WHERE id=436;
