MySQL:触发器

触发器

基本概念

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

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

作用

1、可在写入数据表前,强制检验或转换数据。(保证数据安全)

2、触发器发生错误时,异动的结果会被撤销。(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:事务安全)

3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。(mysql不支持)

触发器优缺点

优点

1、 触发器可通过数据库中的相关表实现级联更改。(如果某张表的数据改变,可以利用触发器来实现其他表的无痕操作[用户不知道])

2、 保证数据安全:进行安全校验

缺点

1、 对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

2、 造成数据在程序层面不可控。(PHP层)

触发器基本语法

创建触发器

create trigger
triggerName --触发器名字
after/before --触发时机
insert/update/delete --触发事件
on 表名 --监视地点
for each row --这句话在mysql是固定的
begin
    sql语句; --监视事件
end;

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

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

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

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

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

  • Insert:插入操作
  • Update:更新操作
  • Delete:删除操作

注意事项

一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个:一张表中只能有一个对应after insert触发器

 因此,一张表中最多的触发器只能有6个:before insert,before update,before delete,after insert,after update,after delete

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

 1、 创建两张表:商品表和订单表

 2、 创建触发器:如果订单表发生数据插入,对应的商品就应该减少库存

Create trigger 名字  after insert on my_orders for each row

 

 查看触发器

1、 查看全部触发器

Show triggers;

 

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

Show create trigger 触发器名字;

 

触发触发器

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

1、 表为my_orders

2、 在插入之后

3、 插入操作

 

删除触发器

基本语法:drop trigger 触发器名字;

 

触发器应用

记录关键字:new、old

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

在触发器中,可以通过old和new来获取绑定表中对应的记录数据。

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

old和new并不是所有触发器都有:

Insert:插入前全为空,没有old

Delete:清空数据,没有new

商品自动扣除库存

 

验证结果

 

如果库存数量没有商品订单多怎么办?

操作目标:订单表,操作时机:下单前;操作事件:插入

 

结果验证

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值