1、触发器简介
触发器定义: 触发器(trigger)是指事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候,系统会自动触发代码、执行;
- 触发器的组成部分: 事件类型,触发时间,触发对象
- 事件类型的分类: 增(insert)、删(delete)、改(update)三种类型;
- 触发时间的分类: 前(before)、后(after)
- 触发对象: 表中的每一条记录(行)
注: 一张表中只能拥有一种触发时间的一种类型的触发器,也就是说一张表最多只能有6个触发器;
2、创建触发器
在mysql高级结构中,没有{},都是用对应的字母符号代替,创建触发
器的基本语法如下:
delimiter 自定义符号; //后续代码只有碰到自定义符号才算结束
create trigger 触发器名 触发时间 事件类型 on 表名 for each row
begin //代表左大括号
..... //里面就是触发器的内容,每行内容都必须使用语句结束符,分号“;”
end //代表右大括号
自定义符号
delimiter ;
实例:
//首先创建如下的表
create table if not exists my_goods(
id int primary key auto_increment,
name varchar(20) not null,
price decimal(10,2) default 1,
inv int comment '库存数量'
);
create table if not exists my_order(
id int primary key auto_increment,
g_id int not null comment '商品id',
g_number int comment '商品数量'
);
//为表创建触发器
delimiter $$
create trigger after_my_order after insert on my_order for each row
begin
update my_goods set inv=inv-1 where id = 2;
end
$$
delimiter ;
创建结果:
附: 上述触发器仍存在一定问题,他是每次当一个表插入数据时,他自己表中的某个字段数据减1,而我们需要的是让他所减的数字不能永远为1,而要是减其插入的数据的大小(修改会在5的实例中提到)。
3、查看所有触发器或者搜索某个触发器
基本语法: show triggers [like ‘patterns’];
查看触发器创建语句: show create trigger 触发器名;
注: 所有的触发器都会保存到information_schema.tirggers表中;
实例:
//查看所有触发器
show triggers;
//搜索以after_开头的触发器
show triggers like 'after_%';
//查看上面触发器建立语句
show create trigger after_my_order;
附加: 触发器不需要手动调用,而是当某种情况发生时会自动触发执行。
4、触发器的删除&修改
触发器不能直接修改,只能先删除掉旧的触发器,然后再添加新的触发器即可。
删除触发器的基本语法: drop trigger 触发器名;
5、触发器的记录
触发器的记录简介: 不管触发器是否触发了,只要 当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态分别保留下来,供触发器使用;其中,要操作的当前状态保存在old中,操作之后的可能形态保存在new中。由此易得, 删除时没有new,插入的时候是没有old的
new和old介绍: old和new都是代表记录本身,任何一条记录除了有数据,还有字段、名字
new和old的使用: old.字段名;
和new.字段名;
实例: 重新设计2的实例中的触发器
delimiter $$
create trigger after_my_order after insert on my_order for each row
begin
update my_order set inv = inv - new.g_number where id = new.id;
end
$$
delimiter ;
至此,即可完成2中要实现的功能。