mysql的触发器
触发器介绍
- 触发器是一种特殊的存储过程,和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL代码,只是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL代码的执行,无需手动调用
- 在mysql中,只有执行insert、delete、update操作时才能触发触发器
- 触发器的这种特性可以协作应用在数据库端确保数据的完整性,日志记录、数据校验等操作
- 使用别名old和new来引用触发器中发送变化的记录内容,这与其他数据库类似,现在触发器还只能支持行级触发,不支持语句触发
2、触发器的特点
- 触发的条件:insert、delete、update
- 触发时机:在增删改之前或之后
- 触发频率:针对每一行
- 触发器定义在表中or附着在表上,一般是附着在表上,即定义完表之后再定义触发器
3、创建触发器
3.1 创建只有一个执行语句的触发器
create trigger trigge_name before|after 触发事件
on table_name for each row
执行语句;
3.2 创建有多个执行语句的触发器
create trigger trigger_name before|after 触发事件
on table_name for each row
begin执行语句列表
end;
3.3 示例:
-
当用户表中有增删改的操作时,日志表能自动记录
– 数据准备
create database demo_trigger; use demo_trigger;create table user(user_id int primary key,user_name varchar(16) not null,password varchar(16) not null )charset = utf8;create table user_logs(id int primary key auto_increment,time timestamp,lob_text varchar(255) )charset = utf8;
– 当用户表增加用户时,日志表自动记录
drop trigger if exists trigger01;create trigger trigger01 after insert on user for each row insert into user_logs values(null, now(), 'user表中添加了新用户');--往user表中添加数据触发触发器 insert into user values(1, 'jack', '123456');
–当用户表中数据被修改时,日志表自动记录
drop trigger if exists trigger02;create trigger trigger02 before update on user for each row insert into user_logs values(null, now(), 'user表中有数据被修改');update user set password = '654321' where user_id = 1;
5、触发器的new和old关键字
5.1 mysql中定义了new和old用来表示触发器所在的表中,触发了触发器的那一行数据,触发器不断能记录有变化,还能记录具体的变化
触发器类型 | new和old的使用 |
---|---|
insert型触发器 | new表示将要(before)或者已经(after)新增的数据 |
update型触发器 | old表示修改之前的数据,new表示将要或已经修改的数据 |
delete型触发器 | old表示将要或已经删除的数据 |
5.2 insert类型触发器
drop trigger if exists trigger03;create trigger trigger03 after insert
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '添加了新用户,信息为:', new.user_id, new.user_name, new.password));insert into user values(2, 'mike', '123456');
5.3 update类型触发器
drop trigger if exists trigger04;create trigger trigger04 after update
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '用户信息被修改', '修改前的user_id:', old.user_id, '修改前的user_name;', old.user_name, '修改前的password:', old.password, '修改后的user_id:', new.user_id, '修改后的user_name;', new.user_name, '修改后的password:', new.password));update user set password = '111111' where user_name = 'mike';
5.4 delete类型触发器
drop trigger if exists trigger05;create trigger trigger05 after delete
on user for each row
insert into user_logs values(null, now(), concat('用户', old.suer_name, '的信息被删除'));delete from user where user_name = 'jack';
6、查看和删除触发器
--查看触发器
show triggers;--删除触发器
drop trigger if exists trigger_name;
7、触发器注意事项
- 触发器不能对本表进行insert、update、delete操作,以免递归循环触发
- 触发器针对每一行的执行,应尽量减少触发器,避免降低效率,对增删改频繁的表切记不要使用触发器,它会非常消耗资源