1. 程式人生 > >mysql 中的觸發器

mysql 中的觸發器

有點像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 ;