MySQL数据库教程之十五:MySQL触发器实例
准备工作:
先启动Navicat for MySQL,建立数据库
建立两个表:Goods(商品表)、Orders(订单表)
Goods(商品表)
create table Goods
(
gid char(8) not null primary key, #商品编号
name varchar(10), #商品名
price decimal(8,2), #价格
num int #数量
);
Orders(订单表)
create table Orders
(
oid int not null primary key auto_increment, #订单号
gid char(10) not null, #商品号
name varchar(10), #商品名
price decimal(8,2), #价格
onum int , #订单数量
otime date #订单时间
);
在商品表中导入商品
insert into Goods values
('A0001', '橡皮', 2.5, 100),
('B0001','小楷本', 2.8, 210),
('C0001','铅笔', 1.2, 120),
('D0001','计算器',28, 20);
任务一、建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量
create trigger tri_insert_orders after insert on orders
for each row
begin
update goods set num = num-new.onum where gid = new.gid;
end;
验证:
在订单表插入订单
insert into orders values
(null, 'A0001','橡皮', 2.5, 51, now());
查看商品表相对应商品的数量(原来数量为100)
select * from Goods where gid = 'A0001';
任务二、建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量
create trigger tri_cancle_orders after delete on orders
for each row
begin
update goods set num= num+old.onum where gid = old.gid;
end
验证:在订单表中删除订单,查看商品表中商品数量
delete from orders where gid = 'A0001';
任务三、建立触发器,实现功能:客户修改订单,商品表对应商品数量同步更新
create trigger tri_update_orders after update on orders for each row
begin
update goods set num= num+(old.onum-new.onum) where gid = old.gid;
end
验证:
开始,‘A0001’订单数为51,后改为72,查看商品表对应商品数量
更改数量
查询商品数量
任务四、建立触发器,实现功能:对于所下订单,进行判断,如果订单的数量>库存数量,就认为是恶意订单,把订单数量变为库存最大数量。
create trigger tri_over_goodsnum before insert on orders for each row
begin
declare rnum int;
select num into rnum from goods where gid = new.gid;
if new.onum > rnum then
set new.onum = rnum;
end if;
update goods set num = 0 where gid = new.gid;
end;
验证:计算器库存为20,商品号:D0001
订单数超过20,查看对应商品数量
查看商品表数量及订单数量