trigger
mysql中觸發器是一種與表操作有關的數據庫對象,當觸發器所在表上出現指定事件時,將調用該對象,即表的操作事件觸發表上的觸發器的執行。
有時在改變表的的某些數據,同時也希望其他相關表中的數據也改變,利用觸發器就能滿足這樣的需求。運用觸發器不公可以簡化程序,而且可以增加程序的靈活性。
創建觸發器語法如下:
create?trigger??name(觸發器名稱) after/befor(觸發時間) insert/update/delete(觸發事件,當填寫其中一種,其它的操作不會激活觸發器) on?(監視的表,即在哪張表上建立觸發器?) for?each?row?(行級觸發器) begin (sql語句,希望改變的數據,可寫多條語句,每條語句必須用?;?結尾) end;
以上sql語句寫上 ; 后就會執行,觸發器未寫完報錯!
這時就會用到 DELIMITER 命令(delimiter 是定界符,分隔符的意思),它是一條命令,不需要語句結束標識,語法 為:
DELIMITER ;;(可以把mysql的結束標識設為其它的符號,如 ;; 或 $ 還可以設為多個長度)
在這之后的語句,以分號結束觸發器不會有什么反應,只有遇到了 ;;,才認為是結束語句。注意:使用完之后,要記得把它修改回來!
假設系統中有兩個表:
商品表 goods(商品ID gid, 商品名稱 goods_name,商品數量 goods_num)
訂單表 ord(訂單oid ,商品ID gid,訂單數量 goods_much )
要創建觸發器來使商品表中的商品數量隨著訂單表的訂單數量自動更新,代碼如下:
delmiter?$ #判斷庫存是否足夠 create?trigger?t1 before insert on?ord for?each?row begin #聲明變量 declare goods_num?int; select?num?into?goods_num?from?goods?where?gid?=?new.gid; #判斷 if?new.much?>?goods_num?then ????set?new.much?=?goods_num; end?if; update?goods?set?num?=?num?-?new.much?where?gid=new.gid end$ delmiter?;
MySQL 中使用 declare 來定義一局部變量,該變量只能在 BEGIN … END 復合語句中使用,并且應該定義在復合語句的開頭,
上述示例中使用了NEW關鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類似,MySQL 中定義了 NEW 和 OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據。
具體地:
?在 INSERT 型觸發器中,NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新數據;
?在 UPDATE 型觸發器中,OLD 用來表示將要或已經被修改的原數據,NEW 用來表示將要或已經修改為的新數據;
?在 DELETE 型觸發器中,OLD 用來表示將要或已經被刪除的原數據;