当前位置:首页 > MySQL
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
);

    现在手上有 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 以 ; 结束

    现在再下一个订单,卖出面包 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 以 ; 结束

    这里的“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;

    考虑到 sql 语句默认是以 ; 结束,所以先使用 delimiter $,告诉 MySQL 以 $ 结束,等创建完触发器后,再修改回以 ; 结束。

版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting