關於MySQL觸發器的問題

一个新手
發布: 2017-10-23 10:30:17
原創
2104 人瀏覽過

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 用來表示將要或已經被刪除的原始數據;

以上是關於MySQL觸發器的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!