1. MySQL触发器
1.1 触发器概念
触发器:指事先为某张表绑定一段代码,当表中的某些内容发生改变(增删改)的时候,系统会自动触发代码并执行。
触发器特性:
- (1)有begin、end体
- (2)触发条件:insert 、delete、update
- (3)触发时机:在增删改前或者后 (一个表最多支持六个触发器:增删改*前后)
- (4)触发频率:针对每一次执行。比较低级(也是缺点)
- (5)触发器定义在表上,附着在表上。不能定义在临时表、视图上
比较消耗资源,一般不使用
1.2 语法
delimiter $
create trigger trigger_name
[definer = {
user | current_user}] # 触发器定义者,可省略
trigger_time trigger_event
on table_name for each row
[trigger_order]
begin
trigger_body
end $
# 说明
trigger_name: {before | after}
trigger_event:{
insert | update | delete}
trigger_order:{follows | precedes} other_trigger_name # 在某个触发器触发 之后| 之前 触发 MySQL5.7版本以后才有的功能
注意:
- replace 也会触发insert ,先把原来数据删除,然后再重新插入
- 从外部加载数据也会触发insert
1.3 执行单行触发器
单行触发器,begin end可以省略
create trigger 触发器名称
before|after insert|update|delete
on 表名 for each row
执行语句;
案例:当新员工入职时,记录员工入职时间
第一步:创建员工表
create table work(
id int auto_increment primary key,
name varchar(64)
);
第二步:创建员工打卡时间表
create table insert_table(
insert_time time
);
第三步:创建触发器
create trigger insert_worker_time
after insert
on work for each row
insert into insert_table (insert_time) value(now());
第四步:增加员工,触发触发器执行
insert into work(name) value('boss');
1.4 执行多行触发器
delimiter $
create trigger 触发器名称
before|after insert|update|delete
on 表名 for each row
begin
执行语句;
end $
1.5 触发器使用
1.5.1 查看触发器
show triggers\G
select * from information_schema.TRIGGERS\G
1.5.2 删除触发器
触发器不使用时就把它删除了,以免出现事故
drop trigger 触发器名;
1.6 触发器中的new & old
- insert事件:new表示将要插入的数据,或者已经插入的数据;没有old
- update事件:old表示将要或者已经修改的数据,new表示将于或已经被插入的数据
- delete事件:old表示已经或者将要被删除的数据;,没有new
1.7 案例
案例:完成订单表与1商品表的关联操作
需求:
(1)订单在每插入一条数据,商品表在的库存就要减少对应的数量
(2)最小商品数为0
(3)订单内商品数量,不能超过商品库存总和
第一步:创建商品表
create table goods(
id int auto_increment primary key,
name varchar(64),
num int
);
第二步:创建订单表
create table orders(
id int auto_increment primary key,
goods_id int,
order_num int
);
第三步:创建触发器
需求1
delimiter $
create trigger create_order
after insert on orders for each row