MySQL 触发器的简单运用
来源:靑龍一笑的博客 作者:靑龍一笑 发布时间:2016-01-21 12:40:20 点击量:648 评论:0
这里通过一个简单的例子来说明触发器的使用。
有下面这两张表,一张商品表(goods),一张订单表(orders):
create table goods
(
id int primary key auto_increment,
name varchar(20),
num int
);
create table orders
(
oid int primary key auto_increment,
gid int,
much int
);
(
id int primary key auto_increment,
name varchar(20),
num int
);
create table orders
(
oid int primary key auto_increment,
gid int,
much int
);
现在手上有 25 块面包,30 块蛋糕,那么先插入两条数据:
insert into goods(name, num) values ('面包', 25), ('蛋糕', 30);
现在下一个订单,卖出 5 块面包:
insert into orders(gid, much) values (NULL, 5);
此时发现,订单是下了,但面包一个也不少,需要手动更新一下商品表的数据:
update goods set num=num-5 where id=1;
接下来使用触发器来完成这一步骤。
创建触发器sale:
delimiter $ # 告诉 MySQL 以 $ 结束
create trigger sale
after insert on orders
for each row
begin
update goods set num=num-5 where id=1;
end$
delimiter ; # 告诉 MySQL 以 ; 结束
create trigger sale
after insert on orders
for each row
begin
update goods set num=num-5 where id=1;
end$
delimiter ; # 告诉 MySQL 以 ; 结束
现在再下一个订单,卖出面包 5 个:
insert into orders(gid, much) values (NULL, 5);
这里有一个问题,就是触发器里更新的商品数据是写死的,换句话说,不管我是卖 2 个面包也好,卖 8 个蛋糕也好,结果都只有一个,就是面包少了 5 个。
现在,删除触发器,重新创建一个触发器:
drop trigger sale;
delimiter $ # 告诉 MySQL 以 $ 结束
create trigger sale
after insert on orders
for each row
begin
update goods set num=num-new.much where id=new.gid;
end$
delimiter ; # 告诉 MySQL 以 ; 结束
delimiter $ # 告诉 MySQL 以 $ 结束
create trigger sale
after insert on orders
for each row
begin
update goods set num=num-new.much where id=new.gid;
end$
delimiter ; # 告诉 MySQL 以 ; 结束
这里的“new.字段名”表示引用被修改后的字段的值,与之相对的是“old.字段名”表示被修改前的字段的值。
现在,该卖蛋糕了。下一个订单,卖出蛋糕 3 个:
insert into orders(gid, much) values (NULL, 3);
最后回顾一下触发器的语法格式:
create trigger 触发器名
after/before insert/update/delete on 表名
for each row
begin
sql 语句;
end;
after/before insert/update/delete on 表名
for each row
begin
sql 语句;
end;
考虑到 sql 语句默认是以 ; 结束,所以先使用 delimiter $,告诉 MySQL 以 $ 结束,等创建完触发器后,再修改回以 ; 结束。
版权所有 © 2005-2023 靑龍一笑的博客 Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.