觸發器mysql
1. mysql觸發器 情景說明web
情景設置,如圖,當咱們點擊了購買,將會發生什麼?sql
現有以下兩張表工具
商品表spa
編號(id)名稱(name)價格(price)庫存(stock)設計
1F2戰鬥機10000100orm
2法拉利80070事件
3航空母艦500020ci
4三棲交通工具100050同步
訂單表
編號(id)商品編號(tid)購買數量(num)下單時間(order_time)
咱們如今要買5架F2戰鬥機,下一個訂單,須要作什麼?
傳統的作法:
insert into ord(tid,num) values(1,5);
update traffic set stock = stock - 5 where id = 1;
新的方式:
咱們可使用觸發器,一觸即發!!
2.mysql觸發器使用:trigger
2.1 觸發器四要素:
地點:(表,table),
監視的事件:(insert,delete,update)
時間:(before/after)
觸發的事件:(insert,delete,update)
2.2建立觸發器的語法:
注意:在寫觸發器以前,要更改的mysql的分隔符。
監視事件和觸發事件之間如何傳遞值?
需求:如今咱們要購買 10輛法拉利, 商品表裏的觸發器應該 這樣寫:
#商品表的觸發器
delimiter $
create triggter tg1
after //事件觸發在 下訂單以後
insert // 監視插入事件
on order // 監視 order訂單表
for each row
begin
update traffic set stock=stock- new,num where id= new id;
end $
在order表的操做:
insert into(tid,num) values(2,10);
如下分析均對於 order表而言
對於insert而言,
新舊關係
New表示是新插入的一行,
要引用其中的tid和num,如何引用?
New.tid
new.num
對於delete而言:
對於update而言
需求:先購買了10個輛法拉利,而後要把數量更改成5,寫出觸發器;
#商品表的觸發器
mysql> delimiter $
mysql> create trigger tg3
-> after
-> update
-> on ord
-> for each row
-> begin
-> update traffic set stock = stock + old.num - new.num where id = new.tid;
-> end $
[關於before]
有沒有before的狀況。
After:在監視事件發生以後觸發的,觸發事件要晚於監視事件。
Before:在監視事件發生以前觸發的,觸發事件要早於監視事件。
需求:若訂單數量超過10的話,就認爲是惡意訂單,只讓其購買10個。
#商品表的觸發器
mysql> delimiter $
mysql> create trigger tg4
-> before
-> insert
-> on ord
-> for each row
-> begin
-> if new.num > 10 then
-> set new.num = 10;
-> end if;
-> update traffic set stock = stock - new.num where id = new.tid;
-> end $
3.觸發器應用場合
1.當向一張表中添加或刪除記錄時,須要在相關表中進行同步操做。
好比,當一個訂單產生時,訂單所購的商品的庫存量相應減小。
2.當表上某列數據的值與其餘表中的數據有聯繫時。
好比,當某客戶進行欠款消費,能夠在生成訂單時經過設計觸發器判斷該客戶的累計欠款是否超出了最大限度。
3.當須要對某張表進行跟蹤時。
好比,當有新訂單產生時,須要及時通知相關人員進行處理,此時能夠在訂單表上設計添加觸發器加以實現