定义
触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL 也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
语法
CREATE TRIGGER trigger_name //触发器名称
trigger_time //触发时间 after | before
trigger_event //触发事件 insert | update |delete
ON tbl_name //在哪一个表
FOR EACH ROW
trigger_stmt //执行的sql语句
查看触发器
show triggers [from 数据库名]
删除触发器
drop trigger [if exists] [数据库名.]trigger_name
执行顺序
一般都是在innodb上建立触发器,因为建立的表支持事务,trigger是事务安全的,如果执行失败的话,会有回滚操作
1.如果 BEFORE 触发器执行失败,SQL 无法正确执行。
2.SQL 执行失败时,AFTER 型触发器不会触发。
3.AFTER 类型的触发器执行失败,SQL 会回滚
举例
1.购物车与库存
CREATE TRIGGER insert_change before insert on `order` for each row
begin
update kucun set num=num-new.num where id=new.id;
end
2.购物车与库存
create trigger update_change before update on `order` for each ROW
begin
update kucun set num=num-(new.num-old.num) where id = new.id;
end
3.优化版本
create trigger update_change before update on `order` for each ROW
begin
set @k_num=(select num from kucun where id=new.id);
if new.num > @k_num+old.num then
set new.num=@k_num+old.num;
end if;
update kucun set num=num-(new.num-old.num) where id = new.id;
end