一、概念
触发器是与表有关的数据库对象,指的是在insert\update\delete操作之前或者之后,能够触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以使得应用在数据库端确保数据的完整性以及日志记录,数据校验等操作。
并且可以使用OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是类似的,但是现在的触发器只支持行级触发,并不支持语句级触发。
触发器类型 |
NEW和OLD的使用 |
insert |
new表示将要或者已经插入的数据,没有old值 |
update | old表示更新之前的数据,new表示将要或者已经更新后的数据 |
delete | old表示将要或者已经删除的数据,没有new值 |
二、相关操作
1、触发器的创建
创建触发器的语法结构:
create trigger trigger_name before/after insert/update/delete on table_name [for each row] --- 行级触发器 begin trigger_stmt; end; 复制代码
通过触发器来记录数据表的数据变化(新增insert、修改update、删除delete)记录。
首先创建一个employee表,并插入数据:
DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `lastName` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `departmentID` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- INSERT INTO `employee` VALUES ('1', '亚索', '123qq.com', '201'); INSERT INTO `employee` VALUES ('2', '李青', '12345@qq.com', '201'); INSERT INTO `employee` VALUES ('3', '剑圣', '2354@qq.com', '202'); INSERT INTO `employee` VALUES ('4', '嘉文', '6565@qq.com', '203'); 复制代码
然后再创建一个日志表来记录employee表进行insert\update\delete操作的时候的日志情况。
create table emplog( id int(11) not null auto_increment primary key, 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 '操作参数' )engine=innodb default charset=utf8; 复制代码
创建insert_trigger触发器记录insert操作的记录,delimiter就是告诉mysql解释器,该段命令是否已经结束了,是否可以执行了。默认情况下,delimiter是分号,遇到分号就执行。但是在触发器中的sql语句中也用到了;与触发器的语句结束冲突,所以这里使用delimiter命令将 delimiter设置为$:
delimiter $ create trigger insert_trigger after insert on employee for each row begin insert into emplog(id,operation,operate_time,operate_id,operate_params) values (null,'insert',now(),new.id,concat('插入后(id:',new.id,',lastname:',new.lastname,',email:',new.email,',departmentID:',new.departmentID,')')); end$ 复制代码
接下来向employee表中插入一条数据,并查询emplog日志表:
INSERT INTO `employee` VALUES ('5', '艾欧尼亚', '774855@qq.com', '203')¥ select * from emplog$ 复制代码
插入数据的记录已经通过触发器记录在了emplog日志表中:
接下来创建一个update触发器,记录更新操作的记录:
create trigger ipdate_trigger after update on employee for each row begin insert into emplog(id,operation,operate_time,operate_id,operate_params) values (null,'update',now(),new.id,concat( '更新前:(id:',old.id,',lastname:',old.lastname,',email:',old.email,',departmentID:',old.departmentID,'), 更新后(',new.id,',lastname:',new.lastname,',email:',new.email,',departmentID:',new.departmentID)); end$ 复制代码
update employee set lastname='厄斐琉斯' where id=3$ select * from emplog$ 复制代码
delete触发器的创建:
create trigger delete_trigger after delete on employee for each row begin insert into emplog(id,operation,operate_time,operate_id,operate_params) values (null,'delete',now(),old.id,concat('删除前(id:',old.id,',lastname:',old.lastname,',email:',old.email,',departmentID:',old.departmentID,')')); end$ 复制代码
delete from employee where id=3$ select * from emplog$ 复制代码
上面就是如何关于触发器的创建以及使用。
2、触发器的查看
如果想要查看自己创建了哪些触发器,可以通过show triggers命令查看触发器的相关信息。
show triggers$ show triggers\G$ 复制代码
\G表示:将查询到的横向表格纵向输出方便查看
3、触发器的删除
如果需要删除触发器可以通过执行命令:
drop trigger [database_name] trigger_name database_name为选填条件,如果没有指定数据库,则默认为当前使用的数据库 复制代码
执行 drop trigger insert_trigger命令后:
以上就是关于触发器的基本使用的介绍。
有任何问题或者不正确的地方欢迎讨论指正!