小貝_mysql 觸發器使用

來源:互聯網
上載者:User

標籤:mysql

觸發器 簡要
1、觸發器基本概念
2、觸發器文法及實戰例子
3、before和after區別

 

一、觸發器基本概念

1、一觸即發

2、作用: 監視某種情況並觸發某種操作

3、觀察情境

一個電子商城:

商品表,goods

主鍵(goods_id)

商品名稱(goods_name)

庫存(goods_number)

1

iphone6

10

2

小米手機

28

 

訂單表,orders

訂單主鍵(order_id)

商品主鍵(goods_id)

購買數量(buy_num)

1

2

3

2

1

4

從php的角度看,完成下單與減少庫存的邏輯如下:

a、下單後,往orders表插入資料:

insert into orders(goods_id,bug_num)values(2,3);

b、修改goods對應商品的庫存:

       update goods setgoods_number=goods_number-3 where goods_id=2;

總結: 這兩個邏輯可以看成是一個整體,或者說,insert—>觸發update

處理方案: 使用觸發器來解決上述問題,我們可以監視某張表的變化,當發生某種變化時,觸發某個操作

4、觸發器監視以及觸發什麼變化

       a、監視update/insert/delete

       b、觸發update/insert/delete


二、觸發器文法

1、建立文法的四個要素

 

2、建立觸發器

2.1、測試案例的表結構

#商品表

create table goods

(goods_id int,goods_name varchar(10),goods_number smallint)charset=utf8;

 

insert into goods

values(1,‘iphone6‘,10),(2,‘小米手機‘,28);

#訂單表

create table orders

(order_id int,goods_id int,buy_num smallint)charset=utf8;

 

insert into orders

values(1,2,3),(2,1,4);


2.2、建立觸發器文法


createtrigger triggerName

after/beforeinsert/update/deleteon Table

begin

       sql語句(一句或多句sql)

end;

2.3、觸發器執行個體

2.3.1、建立觸發器,往訂單表orders插入資料時,更新商品表goods的庫存量


往orders表插入資料前,各個表的資料如下


往orders表插入資料:


查看goods表的資料:


此時,orders表插入的是iphone6兩台,但是減少的卻是小米手機商品的庫存。

當往orders表插入的是小米手機兩台呢?


此時,減少的也是小米手機,但是減少的是1,而不是2

問題:出在哪裡?

1、查看剛建立的觸發器資訊


原來觸發的sql語句是固定某個商品id的,因此,觸發只對該商品id發生作用

2、如何在觸發器引用行的值?

對於insert而言,新增的行,用new來表示,行中的每一列的值,用new.列名來表示

3、修改觸發器t1(刪除原來重建立立)


4、驗證結果

插入前,各個表資料如下


插入orders表,iPhone6三台


插入orders表,小米手機五台

 

2.3.2、建立觸發器,往訂單表orders刪除資料時,更新商品表goods的庫存量

a、建立觸發器t2


b、刪除orders的資料

       b1、刪除前,各個表資料


       b2、刪除後,各個表資料:


總結:

對於delete而言,如何在觸發器引用行的值?

對於delete操作來說,它要操作的資料,已經是存在表中了,因此用old來表示,行中的每一列的值,用old.列名來表示

 

2.3.3、建立觸發器,往訂單表orders修改資料時,更新商品表goods的庫存量

a、建立觸發器t3


b、修改orders表資料

       b1、修改前,各個表的資料


       b2、修改後,各個表的資料

 

總結:

對於update而言,如何在觸發器引用行的值?

對於update操作來說,它要操作的資料,已經是存在表中了,因此用old來引用修改前的值,修改後則為用new來引用新值

 

2.4、查看觸發器和刪除觸發器文法

2.4.1、查看所有觸發器


2.4.2、查看某個觸發器

 

2.4.3、刪除觸發器

 

 

三、before與after的區別

1、區別:

a、after是先完成資料的增刪改後,再觸發

觸發中的語句晚於增刪改,無法影響前面的增刪改動作

b、before是先完成觸發,再增刪改

觸發的語句先於監視的增刪改發生,我們有機會判斷,修改即將發生的操作

2、案例:

對於所下訂單進行判斷,如果訂單的資料>5,則認為是非法訂單,強制把所訂商品資料改成5

2.1、建立觸發器


2.2、插入前,各個表的資料


2.3、插入後,各個表的資料




The quieter you become,the more you are able to hear!

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

小貝_mysql 觸發器使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.