什么是觸發(fā)器
就是trigger(扳機(jī)), 一碰就動(dòng), 一觸即發(fā), 就叫觸發(fā)器
跟存儲(chǔ)過程類似, 也是主要用于增, 刪, 改
事先為某張表綁定一段代碼, 當(dāng)表中的某些內(nèi)容發(fā)生改變的時(shí)候(對(duì)表進(jìn)行增刪改), 系統(tǒng)就會(huì)自動(dòng)觸發(fā)代碼執(zhí)行
監(jiān)聽, 只要...就觸發(fā), 然后執(zhí)行...
觸發(fā)器.png
為什么需要觸發(fā)器?
有些sql語句, 或者數(shù)據(jù)庫操作, 在邏輯上是緊密相關(guān), 不可分割的, 需要一起執(zhí)行
創(chuàng)建觸發(fā)器
創(chuàng)建觸發(fā)器.png
我們需要一些測(cè)試數(shù)據(jù)
drop database if exists mail;
create database mail character set utf8;
use mail;
create table goods(
goods_id int primary key,
goods_name varchar(20) not null,
goods_inventory int not null
);
create table orders(
orders_id int primary key,
orders_goods_id int not null,
orders_buy_number int not null,
foreign key(orders_goods_id) references goods(goods_id)
);
insert into goods set goods_id = 1, goods_name = 'television', goods_inventory = 20;
insert into goods set goods_id = 2, goods_name = 'bicyle', goods_inventory = 99;
insert into orders set orders_id = 1, orders_goods_id = 1, orders_buy_number = 2;
insert into orders set orders_id = 2, orders_goods_id = 2, orders_buy_number = 10;
商城數(shù)據(jù)庫.png
insert
insert之前(語法)
drop trigger if exists 插入前觸發(fā);
create trigger 插入前觸發(fā) before insert on teacher for each row
-- sql語句, 不能是select
begin
end;
insert之后(語法)
drop trigger if exists 插入后觸發(fā);
create trigger 插入后觸發(fā) after insert on teacher for each row
begin
-- sql語句, 不能是select
end;
我們的需求, 當(dāng)訂單表里新增訂單之后, 商品表里的庫存需要相應(yīng)減少
drop trigger if exists change_inventory;
create trigger change_inventory after insert on orders for each ROW begin
update goods
set
goods_inventory = goods_inventory - new.orders_buy_number
where
goods_id = new.orders_goods_id;
end;
insert into orders
set
orders_id = 3,
orders_goods_id = 1,
orders_buy_number = 3;
image.png
image.png
image.png
Snipaste_2019-04-13_17-48-39_看圖王.png
delete
如果訂單取消, 商品的庫存應(yīng)該恢復(fù)
image.png
image.png
我們編寫一個(gè)觸發(fā)器, 如果訂單取消, 則電視機(jī)的庫存恢復(fù)到原來的20
drop trigger if exists recover_inventory;
create trigger recover_inventory after delete on orders for each row begin
update goods
set goods_inventory = goods_inventory + old.orders_buy_number
where goods_id = old.orders_goods_id;
end;
delete from orders where orders_id = 3;
image.png
image.png
查看觸發(fā)器
查看所有觸發(fā)器
show triggers;
image.png
查看觸發(fā)器創(chuàng)建語句
show create trigger 觸發(fā)器名稱;
image.png
刪除&修改觸發(fā)器
觸發(fā)器不能修改, 只能先刪除, 再修改
drop trigger 觸發(fā)器名稱;
最后說明
- 觸發(fā)器中, 只能有增刪改, 不能有查
- 觸發(fā)器中只能對(duì)非監(jiān)聽的表, 進(jìn)行增刪改, 避免死循環(huán)
- 觸發(fā)器的監(jiān)聽對(duì)象,并不都有new和old
trigger監(jiān)聽對(duì)象
監(jiān)聽對(duì)象.png