触发器可以简单的理解为一个与数据表有关的数据库实例,它会在满足定义条件时触发,并执行触发器中定义的语句。它的执行不是由程序调用,也不是手动执行,而是由事件来触发。
触发器在创建时需要指定以下要素:
触发器会在每次符合触发条件时执行一次,例如我们创建了一个在插入数据前执行的触发器,假设插入了1000条数据,那么触发器就会执行1000次,触发器执行的时间会远远大于插入使用的时间,这就会使得效率非常低效,大家在考虑使用触发器时一定要考虑效率问题。
下面我们通过一个日志记录表来熟悉触发器
包含属性id,姓名,性别,年龄
create table student(id int primary key auto_increment,name varchar(20),sex enum("male","female"),age int);
创建一个触发器,不允许年龄小于0或者大于100
在插入前将年龄小于0的年龄改为0,大于100的改为100
delimiter %
create trigger student_age before insert on student for each row begin if new.age > 100 then set new.age = 100;elseif new.age<0 then set new.age = 0;end if;end %
delimiter ;
insert into student values(null,"jack","male",-1),(null,"mack","male",18),(null,"rose","female",21),(null,"marry","female",110);
查看表,发现年龄大于100的被修改为100,小于0的被修改为0
select * from student;
首先创建一个记录日志的表
包含属性id,用户,行为,时间
create table student_log(l_id int primary key auto_increment,l_user varchar(20),l_action enum("insert","update","delete"),l_time datetime);
创建触发器,在插入删除修改后将日志记录到日志表中。
delimiter %
create trigger ins_trigger after insert on student for each row begin insert into student_log value(null,user(),"insert",now()); end%
create trigger up_trigger after update on student for each row begin insert into student_log value(null,user(),"update",now()); end%
create trigger del_trigger after delete on student for each row begin insert into student_log value(null,user(),"delete",now()); end%
delimiter ;
插入数据
insert into student value(null,"zack","male",22);
修改数据
update student set age=17 where name="zack";
删除数据
delete from student where id = 8;
查看日志表
select * from student_log;
show triggers;
删除触发器
drop trigger 触发器名