[/code][img]
[img]http://dl.iteye.com/upload/attachment/0082/0324/afaf913e-e41d-3665-b546-96a3a74a881b.png[/img]
[/img]
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0326/f9a4bbcf-f114-304d-bd77-6f533d15ac85.png[/img]
[/img]
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0328/4f041cf2-c45c-3967-afec-2fa351762860.png[/img]
[/img]
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0330/272bb3b1-ca24-376d-849f-ce26a2447466.png[/img]
[/img]
测试用到两张表: 库存表g
[code="java"]create table g(
id int,
name varchar(10),
number int
);
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0332/916e6729-6bbe-39d1-ba08-b917b163ff74.png[/img]
[/img]
订单表:
create table o(
oid int,
gid int,
much int
);
[color=red]修改结束控制符:
delimiter $ 把以 ; 结尾改为 $结尾。[/color]
【一】监听插入的触发器(例如有客户提交了订单)
create trigger t1
after insert on o
for each row
begin
update g set number = number - new.much where id = new.gid;
end$
当向o表中插入一行数据时(哈哈哈,有人买了两头猪),g表中猪的数量也随着减少两头,还剩20头。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0334/2e4ef0aa-be36-3ace-a4c6-faf429d587bf.png[/img]
[/img]
当向o表中插入一行数据时(哈哈哈,有人买了四只羊),g表中羊的数量也随着减少四只,还剩15只羊。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0336/e0c9a8a1-cee1-3868-8584-de9b86b3b7ae.png[/img]
[/img]
【二】监听删除的触发器(例如有客户取消了订单)
#触发器的创建----监听的是delete动作
create trigger t2
after delete on o
for each row
begin
update g set number = number + old.much where id = old.gid;
end$
当从o表删除一行数据(哈哈,买羊的人不买了),g表中羊的数量也相应的增加四只,变为19只羊。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0338/33ef90f5-4b01-35be-b36c-28432b147808.png[/img]
[/img]
当从o表删除一行数据(哈哈,买猪的人也不买了,fuck),g表中猪的数量也相应的增加两头,变为22头猪。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0340/181b888a-9669-317a-b715-c1a13c504719.png[/img]
[/img]
【三】监听修改的触发器(例如有客户修改了订单)
#触发器的创建----监听的是update动作
create trigger t3
after update on o
for each row
begin
update g set number = number + old.much where id = old.gid;
update g set number = number - new.much where id = new.gid;
end$
有客户首先买了 5头猪,库存中猪的数量较少了5头。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0351/bea988c2-8cdf-3468-a75f-b9bbfaa3a852.png[/img]
[/img]
客户觉得猪肉不好吃,就把订单换成了10只羊。库存中猪的数量增加了5头,羊的数量减少了10只。
[img]
[img]http://dl.iteye.com/upload/attachment/0082/0353/41ab9aed-5f84-3187-8f79-acd4362570ce.png[/img]
[/img]
总结:
触发器四要素:
监视地点、监视事件、触发时间、触发事件。
#修改sql语句的结束符(把结束符由;改为$)
delimiter $
#创建触发器的语法
create trigger triggerName(触发器名字,自定义)
after/before insert/update/delete on 表名
for each row #这句是固定格式
begin
sql语句; #一句或多句,insert/update/delete范围内
end$
(在创建触发器前,把sql的结束符改为了$)
查看有哪些触发器:
show triggers;
删除触发器:
drop trigger 触发器的名字;
如何在触发器中引用行的值:
一、对于insert而言,新增的行用 new来表示,行中的每一列的值用 new.列名来表示。
二、对于delete而言,原本有一行,后来被删除,想引用被删除的这一行,用old来表示,用old.列名
就可以引用被删除行中的值。
三、对于update而言,被修改的行,修改前的数据用old表示,old.列名引用被修改之前行中的值;修改后
的数据用new来表示,new.列名引用被修改之后行中的值。