1、介绍
- 触发器是与表有关的数据库对象,指在
insert/update/delete
之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。 - 使用别名 old和new 来引用触发器中发生变化的记录内容,这与其他数据库时相似的,现在触发器还只是支持行级触发,不支持语句级触发。
触发器类型 | new和old |
---|
insert型触发器 | new表示将要或者已经新增的数据 |
update型触发器 | old表示修改之前的数据,new表示将要或已经修改后的数据 |
delete型触发器 | old表示将要或者已经删除的数据 |
2、语法
create trigger tri_name before/after insert/update/delete on tb_name for each row
begin
trigger_stmt;
end;
show triggers;
drop trigger [schema_name.]tri_name;
- 练习
- 通过触发器记录tb_user表的数据变更日志,将变更日志插入到日志表中tb_user_log 中,包含增加,修改,删除
create table tb_user_logs(
id int(11) not null auto_increment,
operation varchar(20) not null comment '操作类型, insert/update/delete',
operate_time datetime not null comment '操作时间',
operate_id int(11) not null comment '操作的ID',
operate_params varchar(500) comment '操作参数',
primary key(`id`)
)engine=innodb default charset=utf8;
create trigger user_insert_trigger after insert on tb_user for each row
begin
insert into tb_user_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'insert',now(),new.id,concat('插入的数据是:id=',new.id,',name=',new.name,',phone=',new.phone,',email=',new.email,',profession=',new.profession,',age=',new.age,',gender=',new.gender,',staus=',new.status,'createtime=',new.createtime));
end;
show triggers;
drop trigger user_insert_trigger;
insert into tb_user(id, name, phone, email, profession, age, gender, status, createtime)
VALUES (25,'二皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',now());
insert into tb_user(id, name, phone, email, profession, age, gender, status, createtime)
VALUES (27,'三皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',now());
insert into tb_user(id, name, phone, email, profession, age, gender, status, createtime)
VALUES (26,'二皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',now());
create trigger user_update_trigger after update on tb_user for each row
begin
insert into tb_user_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'update',now(),new.id,concat( '更新之前的数据是:id=',old.id,',name=',old.name,',phone=',old.phone,',email=',old.email,',profession=',old.profession,',age=',old.age,',gender=',old.gender,',staus=',old.status,'createtime=',old.createtime,
' || 更新之后的数据是:id=',new.id,',name=',new.name,',phone=',new.phone,',email=',new.email,',profession=',new.profession,',age=',new.age,',gender=',new.gender,',staus=',new.status,'createtime=',new.createtime));
end;
show triggers;
update tb_user set age = 19 where id = 23;
update tb_user set profession = '会计' where id < 5;
drop trigger user_update_trigger;
create trigger user_delete_trigger after delete on tb_user for each row
begin
insert into tb_user_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'delete',now(),old.id,concat( '删除之前的数据是:id=',old.id,',name=',old.name,',phone=',old.phone,',email=',old.email,',profession=',old.profession,',age=',old.age,',gender=',old.gender,',staus=',old.status,'createtime=',old.createtime));
end;
show triggers;
delete from tb_user where id = 27;
drop trigger user_delete_trigger;
总结
1.视图(VIEW)
- 虚拟存在的表,不保存查询结果,只保存查询的SQL逻辑
- 简单、安全、数据独立
2.存储过程(PROCEDURE)
- 事先定义并存储在数据库中的一段SQL语句的集合。
- 减少网络交互,提高性能、封装重用
- 变量、if、case、参数(in/out/inout)、while、repeat、loop、cursor、handler
3.存储函数(FUNCTION)
- 存储函数是有返回值的存储过程,参数类型只能为IN类型存储函数可以被存储过程替代
- 存储函数可以被存储过程替代
4.触发器(TRIGGER)
- 可以在表数据进行INSERT、UPDATE、DELETE之前或之后触发
- 保证数据完整性、日志记录、数据校验
如有侵权,请联系删除,此为本人学习笔记
