觸發(fā)器:它是一個(gè)特殊的存儲(chǔ)過(guò)程,它是MySQL在insert、update、delete的時(shí)候執(zhí)行,自動(dòng)執(zhí)行,不能直接調(diào)用。
它包含四個(gè)要素:
監(jiān)視地點(diǎn)(table)
監(jiān)視事件(insert/update/delete)
觸發(fā)時(shí)間(after/before)
觸發(fā)事件(insert/update/delete)
觸發(fā)器
- 語(yǔ)法:
create trigger trigger_name
after/before insert/update/delete on tb_name
for each row
begin
sql 語(yǔ)句:(觸發(fā)的語(yǔ)句一句或者多句)
end;
-
現(xiàn)有兩張表 商品表 goods 和訂單表 order 來(lái)說(shuō)明觸發(fā)器的工作原理;
(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=2) 我們現(xiàn)在往goods表添加四條記錄:
insert into goods (goods_name,goods_num)values("手機(jī)",20),("電腦",30),("單反",20);
-
實(shí)現(xiàn)購(gòu)買任意商品,對(duì)應(yīng)的商品數(shù)量相應(yīng)的減少:
分析:
監(jiān)視地點(diǎn):order 表
監(jiān)視事件:insert操作
觸發(fā)時(shí)間:在insert操作之后
觸發(fā)事件:update操作
CREATE TRIGGER t1
AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
END;
-
如 我們購(gòu)買5個(gè)手機(jī):
INSERT INTO
order(goods_id,order_num) VALUES(1,5);注:對(duì)于insert 而言 新增的行使用new 來(lái)表示,行中的每一列的值用 new.列名來(lái)表示
這時(shí)我們會(huì)發(fā)現(xiàn)goods表、order表的數(shù)據(jù)如下:
(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=4) -
2.撤銷訂單:
分析:
監(jiān)視地點(diǎn):order 表
監(jiān)視事件:delete操作
觸發(fā)時(shí)間:在delete操作之后
觸發(fā)事件:update操作
DROP TRIGGER if EXISTS t1;
CREATE TRIGGER t1
AFTER DELETE ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
END;
-
現(xiàn)在要取消剛才買的5個(gè)手機(jī)的訂單:
DELETE FROM
orderWHERE order_id=1;注:對(duì)于delete而言 刪除的行使用old 來(lái)表示, 行中的每一列的值用 old.列名來(lái)表示
這時(shí)我們會(huì)發(fā)現(xiàn)goods表、order表的數(shù)據(jù)發(fā)生了如下的變化:
(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=6)
-
修改訂單(包括修改購(gòu)買的數(shù)量以及購(gòu)買的商品)
分兩步:
撤銷訂單;(delete);
新增訂單:(insert);
DROP TRIGGER if EXISTS t1;
CREATE TRIGGER t1
AFTER UPDATE ON `order`
FOR EACH ROW
BEGIN
#撤銷訂單
UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;
#新增訂單
UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;
END;
UPDATE `order` SET goods_id=2,order_num=4 WHERE order_id=2;
現(xiàn)在看下兩張表的變化:
[](http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=7)
(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=8)
注意:
如果在執(zhí)行創(chuàng)建觸發(fā)器的時(shí)候語(yǔ)句報(bào)錯(cuò)
那在 語(yǔ)句之前添加
delimiter $$
CREATE TRIGGER t1
AFTER INSERT ON order
...


