概述
触发器
触发器概念
基本概念
触发器是一种特殊类型的存储过程,它不同于前面所说的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
触发器:trigger
是一种非常接近于js
中的事件的知识。提前给某张表的所有记录绑定一段代码如果该行的操作满足条件,则会触发这段提前准备好的代码
作用
- 可在写入数据表前,强制检验或者转换数据。保证数据安全
- 触发器发生错误时,异动的结果会被撤销(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:类似事务安全特性)
- 部分数据库管理系统可以针对数据定义语言(
DDL
)使用触发器,称为DDL
触发器 - 可依照特定的情况,替换异动的指令(
INSTEAD OF
)。(MySQL
不支持)
触发器优缺点
优点
- 触发器可通过数据库中的相关表实现级联更改
- 保证数据安全
缺点
- 对触发器的过分依赖,势必影响数据库的结构,同时增加了维护的复杂程度
- 造成数据在程序层面不可控
触发器基本操作
创建触发器
基本语法
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
测试案例
需求:有两张表,一张商品表,一张订单表,每次订单生成,商品表中对应的库存就应该发生变化
- 创建两张表:商品表和订单表
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);
- 创建触发器:如果订单表发生插入数据,那么对应的商品就应该减少库存
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 ;
查看触发器
-
查看所有触发器
show triggers;
-
查看触发器的创建语句
show create trigger 触发器名字;
触发触发器
触发触发器:让触发器指定的表中,对应的时机发生对应的操作即可。
- 表为
my_order
- 在插入操作之后
- 插入操作
insert into my_order values(null,1,1);
删除触发器
drop trigger after_insert_order_t;
触发器应用
记录关键字 new
old
触发器针对的是数据表中的每条记录,每条记录在数据操作前后都有一个对应的状态,触发器在执行之前就将对应的状态获取到了,将没有操作之前的状态都保存到old
关键字中,将操作之后的状态都放到new
中。
在触发器中,可以通过old
和new
来获取绑定表中对应的记录数据。但是old
和new
并不是所有的触发器都有
insert
:由于插入前全为空,所以没有old
delete
:由于删除后全为空,所有没有new
基本语法:关键字.字段名
最后
以上就是安静小鸭子为你收集整理的05-06-触发器触发器的全部内容,希望文章能够帮你解决05-06-触发器触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复