1.触发器
1、触发器是一个特殊的存储过程
2、不需要直接调用,在MySQL自动调用的
3、是一个事务,可以回滚
(1)触发器的类型(触发事件)
1、insert触发器
2、update触发器
3、delete触发器
(2)创建触发器
#语法:
Create trigger 触发器名 触发时间[before|after] 触发事件 on 表名 for each row
Begin
//代码
end
(3)new表和old表
1、这两个表是个临时表
2、当触发器触发的时候在内存中自己创建,触发器执行完毕后自动销毁
3、他们的表结构和触发器触发的表的结构一样
4、只读,不能修改
stuinfo curd
打开文件,内存中需要加载,会随即分配一个空间用来保存文件的所有数据,->old 6
在新的一轮操作后,内存会生成新的空间,这个空间里面保存了新的数据变化->new 7
(5)insert触发器
#在stuinfo中插入一个值,就会自动在stumarks中插入一条数据
#after insert 表示的是在insert动作执行完毕以后触发
#on stuinfo for each row 针对的stuinfo表,并且可以读取到每一行的变化
#触发器中定义的局部变量不能与表中的字段名一致,否则会发生字段识别问题(识别不出到底是字段,还是变量)
create trigger trig1
after insert on stuinfo for each row
begin
declare sidno int default 0;
declare nch int default 0;
declare nmath int default 0;
declare nseat int default 0;
set sidno=new.sid;
set nseat=new.seat;
insert into stumarks set sid=sidno,ch=nch,math=nmath,seat=nseat;
end //
insert into stuinfo values(null,'随便','male',20,'合肥',12)//
(6)update触发器
create trigger trig2
after update on stuinfo for each row
begin
declare sidno int default 0;
declare seatno int default 0;
set seatno=new.seat;
set sidno =new.sid;
update stumarks set seat=seatno where sid =sidno;
end //
select ((select max(seat) from stuinfo)+1)//
update stuinfo set seat=12 where sid=12//
(7)delete触发器
create trigger trig3
after delete on stuinfo for each row
begin
declare sidno int default 0;
set sidno =old.sid; #删除了新表里面就没有了,只能从老表里面拿
delete from stumarks where sid=sidno;
end //
delete from stuinfo where sid =13//
#触发器能做钩子函数
(8)查看 和 删除 触发器
show triggers\G
drop trigger if exists trig1//