標籤:
--觸發器是一類特殊的監控增刪改操作,併產生相應的增刪改的操作--1,監視誰 2,監視動作 3,監視時間(之前或之後) 4,觸發的事件--觸發器的簡單文法
create trigger 觸發器名字 after/before(觸發時間) insert/delete/update(監視事件) on 表名 (監視地址) for each row begin sql語句; end;
--因為一條sql語句只能有一個邊界符,所以上面語句會發生錯誤,用delimiter $--將邊界符改為$ 這樣就不會發生衝突--同一個表在同一時間同意動作不能有不同的觸發器--查看已有的觸發器 show triggers;--刪除指定的觸發器 drop trigger 觸發器名字;
--建表語句create table goods(goods_id int not null,goods_name varchar(30) not null default ‘‘,goods_num int )engine myisam charset utf8; --插入資料insert into goods values (1,‘cat‘,32),(2,‘dog‘,42),(3,‘rab‘,43);--建立訂單表create table ord(id int not null,goods_id int not null,num int not null default 0)engine myisam charset utf8;
--更改邊界,最後不需要分號;delimiter $--建立觸發器,當ord表插入一條資料(1,1,1)時 商品cat數量減1create trigger trig1afterinserton ordfor each rowbeginupdate goods set goods_num=goods_num-1 where goods_id=1;end$--然後插入一條資料insert into ord values (1,1,1)$--goods表確實減少了1,但是這個觸發器不具有通用性,--不管買幾個商品和買多少商品,總是cat商品減1drop trigger trig1$--舊的一行資料對象old,新的一條資料對象newcreate trigger trig2afterinserton ordfor each rowbeginupdate goods set goods_num=goods_num-new.num where goods_id=new.goods_id;end$--這個觸發器具有通用性--監控delete語句,當刪除訂單時,需要再把商品加回來create trigger trig3afterdeleteon ordfor each rowbeginupdate goods set goods_num=goods_num+old.num where goods_id=old.goods_id;end$--監控update語句,當更新表時,產生相應的操作,在不修改商品類型的情況create trigger trig4afterupdateon ordfor each rowbeginupdate goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;end$--在這種情況下,會出現爆倉的情況,因為更新的資料可能超過商品的庫存量drop trigger trig4$create trigger trig4beforeupdateon ordfor each rowbegindeclare gnum int;select goods_num into gnum from goods where goods_id=new.goods_id;if (new.num-old.num)>gnum thenset new.num=gnum+old.num;end if;update goods set goods_num=goods_num+old.num-new.num where goods_id=new.goods_id;end$--insert也會出現這種情況,也要更改一下drop trigger trig2$create trigger trig2beforeinserton ordfor each rowbegindeclare gnum int ;select goods_num into gnum from goods where goods_id=new.goods_id;if new.num>gnum thenset new.num=gnum;end if;update goods set goods_num=goods_num-new.num where goods_id=new.goods_id;end$
MySQL資料庫中的觸發器