原文:
mysql學習筆記(十二)觸發器
學習內容:
1.觸發器:
什麼是觸發器?我們什麼時候能夠使用觸發器?
觸發器就是用來監聽某個表的變化,當這個表發生變化的時候來觸發某種操作..比若說兩個表是相互關聯的,當我們在對其中乙個**進行操作的同時,另乙個表內的資料也需要進行某種操作,那麼我們就需要建立乙個觸發器來監聽任何乙個表發生的變化,當其中乙個表的資料發生變化的同時,觸發器裡的**塊將會對另乙個**進行對資料的某種操作。。
總而言之,觸發器一般是使用在表與表之間的,單個的表建立觸發器是沒有任何的意義的。。。。
觸發器的監聽範圍:增,刪,改
觸發的操作:增,刪,改
有點懵,我們來舉乙個例項。。。比如說乙個訂餐系統。。其中存在著乙個訂單數量的資料庫,乙個外賣樣式的資料庫。。當客戶進行訂餐的時候,訂單的數量變化的同時,那麼外賣樣式的資料庫資訊也要發生變化,這兩個表是相互關聯的。。總不能我們的庫存外賣數量已經空了,我們還能夠接受訂單吧?一旦出現這種情況,那麼必定會出現問題。。。因此我們可以使用觸發器來解決這個問題。。。
createtable
order_form
( order_form_id
intnot
null, //
每一種外賣的id
order_form_much
intnot
null
//每一種外賣允許訂的最大數量
);
//建立乙個訂單**.....
create
table
food
( food_id
intnot
null, //
外賣的id資訊
food_name
nvarchar(50) not
null, //
外賣的名字,樣式
food_much
intnot
null
//外賣的庫存量
);insert
into order_form values(1,10),(2,5),(3,15),(4,20),(5,5); //
插入資料資訊
insert
into food values(1,'
澳洲鮑魚
',10),(2,'
龍蝦',5),(3,'
魚翅',15),(4,'
花枝',20),(5,'
干貝',5); //
插入資訊
比如說使用者訂了乙份澳洲鮑魚,那麼food內名字為澳洲鮑魚的庫存數量就需要減一,同時訂單內名字為澳洲鮑魚的數量也需要減一。。。當最大數量減為0的時候,那麼就代表庫存空了,那麼就不再接受客戶的訂單了....
這個過程的實現需要觸發器。。。基本語法:
create
trigger trigger_name (after/before insert
/update
/delete 監聽的範圍) on table_name for
each row
begin
一句或者多句sql語句;
end;
create
trigger trg1 after on order_form for
each row
begin
update food set food_much=food_much-
1where food_id=old.order_form_id; //
這個old必須要加,否則出錯....
end;
update order_form set order_form_much=order_form_much-
1where order_form_id=
1; //
當這句話執行的時候觸發器將被觸發。。意思就是客戶定了乙份外賣,那麼訂單數在減一的同時,庫存量同時也要減少....
這個觸發器不靈活,因為客戶不可能每次都定乙份外賣吧。。有可能訂多份。。。我們是可以對訂的數量進行判斷,但是如果訂了1000份,我們總不能判斷1000次吧。。。因此我們還可以新建乙個**,裡面儲存著每乙份外賣被訂了多少次。。然後通過對這個表儲存的資訊來修改其他兩個表資訊....
create
table
c_count
( id
intnot
null
, num
intnot
null
default0,
primary
key(id);
); 當有訂單的時候,我們把訂單的資料更新到這個**內。。
建立觸發器。。。
create
trigger trg2 after on
update
onfor
each row
begin
update food set food_much=food_much-old.num where food_id=
old.id;
update food set order_form_much=order_form_much-old.num where order_form_id=
old.id;
end;
update c_count set num=
2where id=
3;//觸發器被觸發。。。
上面只是簡單的介紹了一下更新操作,我再簡單的說一下插入和刪除操作是如何觸發監聽的,雖然說模式都差不多,但是還是有一些需要注意的地方...
刪除操作後的觸發:
比如說當使用者取消訂單的時候,那麼我們對應的允許的訂單數量和庫存量也要隨之發生改變。。。
createtable
c_count
( id
intnot
null
, num
intnot
null
default0,
primary
key(id);
); //
還是那個**。。。
create
trigger trg2 after on
update
onfor
each row
begin
update food set food_much=food_much+old.num where food_id=
old.id;
update food set order_form_much=order_form_much+old.num where order_form_id=
old.id; //也是使用(old.資料) 來表示刪除前的資料資訊
end;
delete
from c_count where id=
1;
插入操作的觸發:
比如說:店內新增了一樣產品。。。那麼我們仍然需要更新資料庫內的資訊...
mysql>create
trigger trg1 after insert
on c_count for
each row
->
begin
->
insert
into food values(6,'
比目魚',8
);
->
insert
into order_form values(6,8
);
->
end;
mysql
>
insert
into c_count values(6,8
);
//這裡還有乙個注意。。就是像上面刪除的地方我們需要使用(old.資料)來操作我們刪除之前的資料。。。那麼這裡的插入操作,我們需要使用(new.資料)來操作我們插入的新資料...
刪除觸發器:
droptrigger trg1;
檢視觸發器資訊:
show triggers;
觸發器裡after和before的區別:
after是先安完成資料的增,刪,改再觸發
觸發的語句晚於監視的增,刪,改,無法影響前面的增刪改動作
before是先完成觸發,再增刪改
觸發的語句先於監視的增刪改發生,我們有機會判斷,修改即將發生的操作
MySQL學習筆記6(觸發器)
觸發器 trigger 是由事件來觸發某個操作。這些事件包括insert語句 update語句和delete語句。當資料庫系統執行這些事件時,就會啟用觸發器執行相應的操作。1 觸發器的含義和作用 2 如何建立觸發器 3 如何檢視觸發器 4 如何刪除觸發器 語法基本形式為 create trigger...
(八)MySQL學習筆記 觸發器
觸發器有三種 觸發器型別 old的含義 new的含義 insert 型觸發器 無 因為插入前狀態無資料 new 表示將要或者已經新增的資料 update 型觸發器 old 表示修改之前的資料 new 表示將要或已經修改後的資料 delete 型觸發器 old 表示將要或者已經刪除的資料 無 因為刪除...
MySQL學習筆記(12) 觸發器
本文更新於2019 06 23,使用mysql 5.7,作業系統為deepin 15.4。目錄為了便於描述,此處將建立觸發器的ddl複述一次,其已於 sql 章節描述。create trigger triggername before after insert update delete on ta...