mysql 中的觸發器
阿新 • • 發佈:2018-12-25
有點像js的事件。可以監視某張表的操作,並觸發相關操作
事先為某張表繫結一段程式碼,當表中的某些內容發生改變的時候(增刪改),系統會自動觸發程式碼,執行。
例子: 有兩張表,一張訂單表,一張商品表,每生成一個訂單,意味著商品的庫存要減少。
觸發器
觸發器:事件型別、觸發事件、觸發物件
事件型別:增刪改
觸發時間: 前後before after
注: 只有表才支援觸發器,檢視不支援。
每個表每個事件只允許一個觸發器。因此,每張表最多有6個觸發器(insert前後,update前後,delete前後)
建立觸發器
語法:
create trigger t1(觸發器名稱) after (觸發時間) insert (事件型別) on orders(哪張表,觸發物件) for each row (為每一行繫結) begin (開始) update goods xxx (觸發器的內容,每行內容都必須使用語句結束符,分號) end; (結束)
這裡就產生了兩個分號。這個時候我們需要
delimiter 自定義符號
臨時修改語句結束符,後續程式碼中只有碰到自定義符號才算結束。
將臨時修改修正過來
delimiter ;
例子
給orders表增加一個觸發器
delimiter $
create trigger demo1
after
insert
on orders
for each row
begin
update goods set num = num-1 where gid = 1;
end$
delimiter ;
然後我們向orders表插入一條資料
insert into orders values(123,1,4);
發現goods表確實發生變化了
但是隻是gid為1的num 僅僅減去了1
因為我們上面寫死了,這裡需要向觸發器進行傳參
需要先刪除觸發器
drop trigger demo1;
show triggers;
檢視所有觸發器,發現demo1觸發器被我們刪除掉了。
解決上述的問題。
old new
在MySQL中用old、new用來記錄當前狀態和即將執行後的新狀態。
插入的時候,沒有old
刪除的時候,沒有new
delimiter $ create trigger demo1 after insert on orders for each row begin update goods set num = num - new.much where gid = new.gid; end$ delimiter ;