程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 小貝_mysql觸發器使用

小貝_mysql觸發器使用

編輯:MySQL綜合教程

小貝_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!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved