明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

對(duì)于MySQL觸發(fā)器的問(wèn)題

[摘要]triggerMysql中觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。有時(shí)在改變表的的某些數(shù)據(jù),同時(shí)也希望其他相關(guān)表中的...

trigger

Mysql中觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫(kù)對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。

有時(shí)在改變表的的某些數(shù)據(jù),同時(shí)也希望其他相關(guān)表中的數(shù)據(jù)也改變,利用觸發(fā)器就能滿足這樣的需求。運(yùn)用觸發(fā)器不公可以簡(jiǎn)化程序,而且可以增加程序的靈活性。

創(chuàng)建觸發(fā)器語(yǔ)法如下:

create trigger  name(觸發(fā)器名稱)
after/befor(觸發(fā)時(shí)間)
insert/update/delete(觸發(fā)事件,當(dāng)填寫(xiě)其中一種,其它的操作不會(huì)激活觸發(fā)器)
on (監(jiān)視的表,即在哪張表上建立觸發(fā)器 )
for each row (行級(jí)觸發(fā)器)
begin
(sql語(yǔ)句,希望改變的數(shù)據(jù),可寫(xiě)多條語(yǔ)句,每條語(yǔ)句必須用 ; 結(jié)尾)
end;

以上sql語(yǔ)句寫(xiě)上 ; 后就會(huì)執(zhí)行,觸發(fā)器未寫(xiě)完報(bào)錯(cuò)!

這時(shí)就會(huì)用到 DELIMITER 命令(delimiter 是定界符,分隔符的意思),它是一條命令,不需要語(yǔ)句結(jié)束標(biāo)識(shí),語(yǔ)法 為:

DELIMITER ;;(可以把mysql的結(jié)束標(biāo)識(shí)設(shè)為其它的符號(hào),如 ;; 或 $ 還可以設(shè)為多個(gè)長(zhǎng)度)

在這之后的語(yǔ)句,以分號(hào)結(jié)束觸發(fā)器不會(huì)有什么反應(yīng),只有遇到了 ;;,才認(rèn)為是結(jié)束語(yǔ)句。注意:使用完之后,要記得把它修改回來(lái)!

假設(shè)系統(tǒng)中有兩個(gè)表:
商品表 goods(商品ID gid, 商品名稱 goods_name,商品數(shù)量 goods_num)
訂單表 ord(訂單oid ,商品ID gid,訂單數(shù)量 goods_much )
要?jiǎng)?chuàng)建觸發(fā)器來(lái)使商品表中的商品數(shù)量隨著訂單表的訂單數(shù)量自動(dòng)更新,代碼如下:

delmiter $
#判斷庫(kù)存是否足夠
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 來(lái)定義一局部變量,該變量只能在 BEGIN … END 復(fù)合語(yǔ)句中使用,并且應(yīng)該定義在復(fù)合語(yǔ)句的開(kāi)頭,

上述示例中使用了NEW關(guān)鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類(lèi)似,MySQL 中定義了 NEW 和 OLD,用來(lái)表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。
具體地:
在 INSERT 型觸發(fā)器中,NEW 用來(lái)表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
在 UPDATE 型觸發(fā)器中,OLD 用來(lái)表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW 用來(lái)表示將要或已經(jīng)修改為的新數(shù)據(jù);
在 DELETE 型觸發(fā)器中,OLD 用來(lái)表示將要或已經(jīng)被刪除的原數(shù)據(jù);

以上就是關(guān)于MySQL觸發(fā)器的問(wèn)題的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。