觸發(fā)器:
一類特殊的數(shù)據(jù)庫程序,可以監(jiān)視某種數(shù)據(jù)的操作(insert/update/delete),并觸發(fā)相關(guān)的操作(insert/update/delete),保護數(shù)據(jù)的完整性
應(yīng)用場景:數(shù)據(jù)同步 例如:當(dāng)一個用戶完整信息保存在A/B/C三張表中,傳統(tǒng)方法維護用戶信息需要將對應(yīng)的信息使用條SQL語句,依次插入,但是使用觸發(fā)器的方式的話,我們可以只用插入A表中一條數(shù)據(jù),就會自動觸發(fā)數(shù)據(jù)插入B/C表的操作,這樣就可以通過一個表的操作,同步其他操作,實現(xiàn)自動化維護數(shù)據(jù)的目的。
觸發(fā)器語法格式:
creat trigger 觸發(fā)器名稱after/before(觸發(fā)器工作的時機)update/delete/insert(觸發(fā)器監(jiān)聽事件)on 表名(觸發(fā)器監(jiān)聽的目標(biāo)表)for each row(行級監(jiān)視,MySQL固定寫法,Oracle不同)begin sql語句集........(觸發(fā)器執(zhí)行動作,分號結(jié)尾)end;刪除觸發(fā)器:drop trigger if exist 觸發(fā)器名稱 查詢數(shù)據(jù)庫觸發(fā)器:show triggers;
行變量:當(dāng)目標(biāo)表發(fā)生改變時候,變化的行可用行變量表示
new:代表目標(biāo)表目標(biāo)行發(fā)生改變之后的行 old:代表目標(biāo)表目標(biāo)行發(fā)生改變之前的行
觸發(fā)器案例:商品表/訂單表(商品數(shù)量控制) 
 觸發(fā)器監(jiān)聽:insert
 觸發(fā)器監(jiān)聽:insert
分析:orders表添加新的記錄之后,goods表對應(yīng)的商品數(shù)量同步減少對應(yīng)的商品訂單出數(shù)量
觸發(fā)器監(jiān)聽:delete
create trigger tr2after delete on ordersfor each rowbeginupdate goods set godnum= godnum+old.godnum where id = old.id;end分析:客戶刪除訂單,恢復(fù)商品表對應(yīng)商品的數(shù)量
觸發(fā)器監(jiān)聽:update
create trigger tr3after update on ordersfor each rowbeginupdate goods set godnum= godnum+(old.godnum-new.godnum) where id = old.id;end分析:客戶修改訂單,商品表對應(yīng)商品數(shù)量同步更新
觸發(fā)器聲明變量用法:
create trigger tr4before insert on ordersfor each rowbegin declare godSum int default 0; -- 定義觸發(fā)器變量 select godNum into godSum from goods where godId = new.godId; -- 變量賦值 if godSum< new.godNum then-- 觸發(fā)器控制邏輯 update goods set godNum = new.godNum where godId = new.godId; end if;end分析:當(dāng)客戶新建訂單超過商品表的商品數(shù)量則修改商品表,保商品表商品庫存量非負(fù)
mysql觸發(fā)器特別注意:
①:for each row:必須填寫,保證mysql支持行級控制,oracle同時支持行級控制和語句級控制
②:注意:如果在BEFORE或AFTER觸發(fā)程序的執(zhí)行過程中出現(xiàn)錯誤,將導(dǎo)致調(diào)用觸發(fā)程序的整個語句的失敗。對于事務(wù)性表,如果觸發(fā)程序失敗(以及由此導(dǎo)致的整個語句的失敗),該語句所執(zhí)行的所有更改將回滾。對于非事務(wù)性表,不能執(zhí)行這類回滾,因而,即使語句失敗,失敗之前所作的任何更改依然有效。
新聞熱點
疑難解答
圖片精選