mysql

来源:互联网 发布:ubuntu改中文 编辑:程序博客网 时间:2024/06/07 03:01

触发器:事先为某张表绑定一段代码,当表中的某些内容发生改变的时候(增删该)系统会自动触发代码,执行

有事件类型,触发时间,触发对象
事件类型:增删改
触发时间:before和after
触发对象:表中的每一条记录

一张表中只能拥有一种触发时间的一种类型的触发器,最多一张表有6个触发器。

创建触发器
delimiter 自定义符号:后续代码中只有碰到自定义符号才算结束
create trigger 触发器名字 触发时间 事件类型 on 表名 for each row
begin
触发器的内容:每行内容都必须使用语句结束符:分号
end
delimiter ;

订单与商品表
delimiter &&
create trigger after_order after insert on order for each row
begin
–新增一条订单:old没有,new代表新的订单记录
update goods set inv = inv-new.g_number where id=new.g_id;
end
&&
delimiter ;

查看触发器
show triggers\G;
查看触发器创建语句
show create trigger after_order\G;

触发器不能修改,只能先修改后新增
删除触发器
drop trigger after_order;

触发器记录
不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保存下来,供触发器使用,其中,要操作的当前状态保存到old中,操作之后的可能形态保存给new.
old代表的是旧记录,new代表的是新记录
删除的时候是没有new的,插入的时候没有old
old和new都是代表记录本身,任何一条记录除了有数据还有字段名字
使用方式:old.字段名 /new.字段名(new代表的是假设发生之后的结果)

分支结构
if 条件判断 then
–执行代码;
else
–执行代码;
end if;

订单生成之前要判断库存是否满足
delimiter &&
create trigger before_order before insert on order for each row
begin
–判断商品库存是否足够
–获取库存
select inv from goods where id=new.g_id into @inv;
–比较库存
if @inv < new.g_number then
insert into xxx values(xxx);
end if;
end
&&
delimiter ;