觸發器:trigger
監控某資料操作(insert/update/delete)並觸發相應的操作(insert/update/delete)
觸發器幾個概念
監視地點table
監視事件insert/update/delete
觸發時間after/before
觸發事件insert/update/delete
例子: 商品表goods,訂單表goodsorder
表結構如下
goods
idname(商品名)num(數量)
goodsorder
idgid(商品id)much(數量)
當下乙個訂單時,對應的商品數量相應減少
分析:監視地點: goodsorder
監視事件:insert
觸發事件:update
先修改下結束符 delimiter $
create trigger trigger1
after
insert
on goodsorder
for each row
began
update goods set num=num-1 where id=1; (進行sql語句)
end$
這裡怎麼傳值呢?
所以要引入行變數的概念
引數傳值
分析:我們監視的是goodsorder表的insert語句,那麼insert語句產生的資料能否在觸發器中引用呢?
使用new/old表示表名
操作行為 表名表示方式
insert 語句中 新產生的 new
delete語句中 刪除的old
update語句中 修改前old
修改後 new
例:刪除訂單表中的訂單,使之商品表的數量自動更新
修改上述中的觸發器
delimiter $
create trigger trigger2
after insert on goodsorder
for each row
begin
update goods set num=num-new.much where id=new.gid;
end$
例如:修改訂單表中的資料,使之商品表中的數量自動更新
create trigger trigger3
before update on goodsorder
for each row
begin
update goods set num = num - old.much + new.much where id=old.gid;
end$
在上面兩個觸發器中可以看到有before/after ,這就是在檢測點之前還是檢測點滯後進行觸發
宣告變數
declare
變數名 型別;
賦值 into 變數名
例子:假如目前a物品剩餘2件,但是一使用者購買了5件,怎麼防止爆倉
思路:先查詢商品倉庫數量有沒有大於購買數量
若 大於 購買數量=商品倉庫裡數量
否則正常購買
create trigger trigger4
after insert on goodsorder
for each row
begin
declare rnum int;
select num into rnum from goods where id=new.gid;
if rnum
若使用after 則會報錯 error 1362 (hy000): updating of new row is not allowed in after trigger
這就是說只有在觸發器之前才能進行變數操作
所以要把after換成before
for each row 是行級觸發器,影響多少行觸發多少次
不加此句則為語句級觸發器,只觸發一次
oracle 支援行級和語句級觸發器
mysql 只支援行級能觸發器
積分觸發器 mysql 觸發器的使用
將多個資料庫中的某列資料同步時需要用到mysql觸發器,以下可做參考,已簡單測試ok.修改紅棗的積分時觸發 drop trigger if exists u hongzaocount delimiter create trigger u hongzaocount after update on ho...
mysql 觸發器 觸發器使用
1 了解什麼是觸發器?mysql 的觸發器和儲存過程一樣,都是嵌入到mysql的一段程式,觸發器 是由事件觸發某個動作,這些事件包括,插入 更新 刪除等語句。如果定義了觸發程式,觸發器就會觸發執行相應的操作。觸發器 trigger 是個特殊的儲存過程,不同的是,執行儲存過程要使用call語句來呼叫,...
觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...