觸發器(trigger)
作用:監視某種情況並觸發某種操作。
觸發器定義:進行數據庫應用軟件的開發時,我們有時會碰到表中的某些數據改變,希望同時引起其他相關數據的改變的需求,利用觸發器就能滿足這樣的需求。
它能在表中的某些特定數據變化時自動完成某些查詢。運用觸發器不僅可以簡化程序,而且可以增加程序的靈活性。
觸發器是一類特殊的事務:可以監視某種數據操作(insert/update/delete),並觸發相關操作(insert/update/delete )。
觸發器應用場合:
1.當向一張表中添加或刪除記錄時,需要在相關表進行同步操作。如:當一個訂單產生時,訂單所購的商品庫存應相應減少。
2.當表上某列數據的值與其他表中的數據有聯系時。如:當某客戶進行欠款消費,可以在生成訂單時通過設計觸發器判斷該客戶的累計欠款是否超出了最大額度。
3.當需要對某張表進行跟蹤時。如:當有新訂單產生時,需要及時通知相關人員進行處理,此時可以在訂單表上設計添加觸發器加以實現。
觸發器的四要素:
監視地點(table),監視事件(insert/update/delete),觸發時間(after/before),觸發事件(insert/update/delete)

創建觸發器語法:
create trigger 觸發器名稱
after/before(觸發時間)
insert/update/delete(觸發事件)
on 表名(監視地址)
for each row--此句在MySQL中是寫死的,只有行觸發器,在oracle中還有表觸發器
begin
sql1
...
sqlN
end;
觸發器舉例:
需求:
商品表:goods
訂單表:ord
當下一個訂單時,對應的商品要相應減少(買幾個商品減少幾個庫存)、
分析:
監視誰:ord
監視動作:insert
觸發時間:after
觸發事件:update
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-2 where gid=1;
end;
深入分析會發現,該觸發器所有數據寫死,每次不管買任何商品,都只會減少gid=1的商品。
如何在觸發器引用行的值
對於insert而言,新增的行用new來表示;行中的每一列的值,用new.列名來表示。
對於delete而言,刪除的行用old來表示,行中的每一列的值,用old.列名來表示。
對於update而言,被修改的行,修改前的數據用old來表示,old.列名引用被修改前的行中的值;修改后的數據用new來表示,new.列名引用被修改后的行中的值。


舉例升級:
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid;
end;

注意:老版本的MySQL默認遇到分號結束,如上寫法會提示錯誤,需要先用
delimite $將默認分號結束改成功“$”結束(當然也可改成其他結束符),然后end后面跟$即可,begin后的語句仍用分號結束即可。
刪除觸發器語法:drop trigger 觸發器名;
查看所有觸發器:show triggers;
before與after的區別
after是先完成數據的增、刪、改,再觸發。意味着無法影響前面的增刪改。
before是先完成觸發,再進行數據的增、刪、改。觸發的語句先於監視的增刪改發生,意味着我們有機會審查、判斷、修改即將發生的操作。
典型案例:
對於所下訂單進行判定,若訂單數量>5則認為是惡意訂單,強制將訂單數量改成5.
實現結果:

