MySQL 之觸發器詳解

jopen 11年前發布 | 12K 次閱讀 MySQL 數據庫服務器

觸發器,顧名思義,一觸即發。

可以是在事件觸發前,也可以是在世界觸發后。

觸發器創建語法:

官方定義:

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event     ON tbl_name FOR EACH ROW trigger_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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!