文章目录
创建触发器查看触发器使用触发器修改触发器 & 删除触发器触发器记录
触发器:trigger,事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候,即增删改操作,系统会自动触发代码执行触发器:事件类型、触发时间、触发对象事件类型:增删改:三种类型:insert、delete、update触发时间:前后:before、after触发对象:表中的每一条记录一张表中只能拥有一种触发时间的一种事件类型的触发器:最多一张表能有6个触发器
创建触发器
在mysql高级结构中:没有大括号,都是用对应的字符符号代替触发器基本语法
-- 临时修改SQL语句结束符
delimiter 自定义SQL语句结束符号:后续代码中只有碰到自定义SQL语句结束符号才算结束
create trigger 触发器名称 触发时间 事件类型 on 表名称 for each row
begin -- 代表左大括号:开始
... -- 里面就是触发器的内容:每行内容都必须使用语句结束符:即分号
end -- 代表右大括号:结束
自定义SQL语句结束符 -- SQL语句结束符
delimiter ; -- 将临时的SQL语句结束符修改为分号
创建商品表
-- 创建库存表
create table goods(
id int primary key auto_increment,
name varchar(20) not null comment '商品名称',
price decimal(10,2) default 1 comment '商品价格',
inv int unsigned comment '库存数量'
)charset utf8;
insert into goods values(null,'iPhone6s',5288,100),(null,'s6','6088',100);
创建订单表
create table orders(
id int primary key auto_increment,
gid int not null comment '商品ID',
gnumber int comment '商品数量'
)charset utf8;
创建触发器:生成一个订单,商品就减少一个
delimiter $$ -- 修改SQL语句结束符号: $$,默认的SQL语句结束符号是分号: ;
-- 创建触发器
create trigger after_orders after insert on orders for each row
begin -- 开始
update goods set inv = inv - 1 where id = 2;
end -- 结束
$$ -- SQL语句结束: 整个触发器创建语句结束
delimiter ; -- 还原SQL语句结束符号
生成一条订单
查看触发器
show triggers;
show triggers like 'pattern';
show create trigger 触发器名称[\g或\G];
所有的触发器都会保存到一张表中:information_schema.triggers
使用触发器
触发器不需要手动调用,而是当某种情况发生时会自动触发:例如订单里面插入记录之后会触发相应的触发器
修改触发器 & 删除触发器
触发器不能修改:只能先删除再创建
drop trigger 触发器名称;
触发器记录
触发器记录:不管触发器是否被触发了,只要当某种操作准备执行(实际上是触发器还没有执行),系统就会将当前要操作的记录的当前状态和即将被执行后的新状态给分别保留下来,以供触发器使用:其中,要操作的当前状态保存到old中,操作之后的可能状态保存到new中old代表旧记录,new代表新记录:但是此触发器并没有执行 新增记录的时候是没有old;删除记录的时候是没有new只有更新记录的时候才会同时有old与new如果触发器内部只有一条要执行的SQL指令,可以省略大括号,即begin和end
create trigger after_orders after insert on orders for each row
一条SQL语句;
触发器可以很好的协调表内部的数据处理顺序和关系:但是从应用程序的角度出发,触发器会增加数据库维护的难度,所以较少适用触发器