MySQL 之觸發器詳解
觸發器,顧名思義,一觸即發。
可以是在事件觸發前,也可以是在世界觸發后。
觸發器創建語法:
官方定義:
CREATE [DEFINER = {user
| CURRENT_USER }] TRIGGERtrigger_name
trigger_time
trigger_event
ONtbl_name
FOR EACH ROWtrigger_body
看不懂,來個直觀的:
create triggertriggerName
After/before insert/update/delete on表名
for each row // 這句話固定的,mysql的觸發器只支持行級別。
Begin
要執行的sql語句
End;
觸發器只支持增刪改這些操作。
這是商品表,num,代表庫存。
mysql> select * from goods; +----+--------+--------+-------+-----+ | id | name | cat_id | price | num | +----+--------+--------+-------+-----+ | 1 | 蘋果 | 1 | 4999 | 7 | | 2 | nexus4 | 2 | 1999 | 5 | | 3 | nokia | 3 | 1222 | 20 | | 4 | 榮耀2 | 2 | 1888 | 5 | | 5 | n93 | 3 | 2500 | 10 | | 6 | 三星 | 2 | 3000 | 2 | +----+--------+--------+-------+-----+ 6 rows in set
這是訂單表,num,所訂購商品的數量。
mysql> select * from orders; +----+---------+---------+-----+ | id | user | good_id | num | +----+---------+---------+-----+ | 1 | gaotong | 1 | 1 | +----+---------+---------+-----+ 1 row in set
現在需要做的是,當對orders表進行增刪改時,goods表的庫存量會相應的變化。
由于我們早在trigger中執行sql語言,是以“ ; ”號結尾。要先更改下分隔符。
分別以new 和 old 來引用,新行和舊行。看例子就知道了:
mysql> delimiter $ mysql> create trigger onInsertTrigger -> after insert on orders -> for each row -> Begin -> update goods set num = num + new.num where id = new.good_id; -> End$ Query OK, 0 rows affected
這樣,在插入數據時,goods表的數據會相應的變化。
刪除和更新,同理!
再來看下怎么用before。
現在希望在插入數據之前做一些判斷,如果插入的訂單數大于10,就是非法的。
要把訂單數量改為5,然后再插入。
首先要刪除原來的trigger。
mysql> drop trigger onInsertTrigger$ Query OK, 0 rows affected
mysql> create trigger checkInsert -> before insert on orders -> for each row -> Begin -> if new.num > 10 then -> set new.num = 5; -> end if; -> update g set num = num-new.num where id = new.good_id; -> end$ Query OK, 0 rows affected
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!