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、刪除觸發器
1、區別:
a、after是先完成數據的增刪改後,再觸發
觸發中的語句晚於增刪改,無法影響前面的增刪改動作
b、before是先完成觸發,再增刪改
觸發的語句先於監視的增刪改發生,我們有機會判斷,修改即將發生的操作
2、案例:
對於所下訂單進行判斷,如果訂單的數據>5,則認為是非法訂單,強制把所訂商品數據改成5
2.1、建立觸發器
2.2、插入前,各個表的數據
2.3、插入後,各個表的數據