05-06-触发器

触发器

触发器概念

基本概念

触发器是一种特殊类型的存储过程,它不同于前面所说的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。

触发器:trigger是一种非常接近于js中的事件的知识。提前给某张表的所有记录绑定一段代码如果该行的操作满足条件,则会触发这段提前准备好的代码

作用

  1. 可在写入数据表前,强制检验或者转换数据。保证数据安全
  2. 触发器发生错误时,异动的结果会被撤销(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:类似事务安全特性)
  3. 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器
  4. 可依照特定的情况,替换异动的指令(INSTEAD OF)。(MySQL不支持)

触发器优缺点

优点
  1. 触发器可通过数据库中的相关表实现级联更改
  2. 保证数据安全
缺点
  1. 对触发器的过分依赖,势必影响数据库的结构,同时增加了维护的复杂程度
  2. 造成数据在程序层面不可控

触发器基本操作

创建触发器

基本语法
create trigger 触发器名字 触发时机 触发事件 on 表 for each row
begin
end

触发对象:on 表 for each row,触发器绑定实质是表中的所有行,因此当每一行发生指定的改变的时候,就会触发触发器。

触发时机

每张表中对应的行都会有不同的状态。当SQL指令发生的时候,都会令行中数据发生改变,每一行总会有两种状态:数据操作前和操作后

before:在表中数据发生改变前的状态

after:在表中数据已经发生改变后的状态

触发事件

触发事件:MySQL中触发器针对的目标是数据发生改变,对应的操作只有写操作(增删改)

注意事项

一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个。因此一张表最多的触发器只有六个:before insert``after insert``before update``after update``before delete``after delete

测试案例

需求:有两张表,一张商品表,一张订单表,每次订单生成,商品表中对应的库存就应该发生变化

  1. 创建两张表:商品表和订单表
	create table my_goods(
	id int primary key auto_increment,
	name varchar(20) not null,
	inv int
	)charset=utf8;
	create table my_order(
	id int primary key auto_increment,
	goods_id int not null,
	goods_num int not null
	)charset=utf8;
	insert into my_goods values(null,'手机',1000),(null,'电脑',500),(null,'平板',100);

在这里插入图片描述

  1. 创建触发器:如果订单表发生插入数据,那么对应的商品就应该减少库存
delimiter $$
create trigger after_insert_order_t after insert on my_order for each row
begin
update my_goods set inv=inv-new.goods_num where id=new.goods_id;
end
$$
delimiter ;

在这里插入图片描述

查看触发器

  1. 查看所有触发器

    show triggers;

    在这里插入图片描述

  2. 查看触发器的创建语句

    show create trigger 触发器名字;

    在这里插入图片描述

触发触发器

触发触发器:让触发器指定的表中,对应的时机发生对应的操作即可。

  1. 表为my_order
  2. 在插入操作之后
  3. 插入操作
insert into my_order values(null,1,1);

在这里插入图片描述

删除触发器

drop trigger after_insert_order_t;

触发器应用

记录关键字 new old

触发器针对的是数据表中的每条记录,每条记录在数据操作前后都有一个对应的状态,触发器在执行之前就将对应的状态获取到了,将没有操作之前的状态都保存到old关键字中,将操作之后的状态都放到new中。

在触发器中,可以通过oldnew来获取绑定表中对应的记录数据。但是oldnew并不是所有的触发器都有

  • insert:由于插入前全为空,所以没有old
  • delete:由于删除后全为空,所有没有new

基本语法:关键字.字段名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值