Mysql高级四 之 触发器

纵然是瞬间 提交于 2020-01-29 23:30:56

Mysql高级四 之 触发器

1.1介绍

触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合.触发器的这种特性可以协助用在数据库端确保数据的完整性,日志记录,数据校验等操作.

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的.现在触发器还支持行级触发,不支持语句级触发.

触发器类型 NEW和OLD的使用
INSERT触发器 NEW表示要或者已经新增的数据
UPDATE触发器 OLD表示修改之前的数据,NEW表示将要或已经要或已经修改后的数据
DELETE触发器 OLD表示将要或者已经删除的数据

1.2 创建触发器

语法结构:

create trigger trigger_name

before/after  insert/update/delete/

on tb1_name

[for each row] -- 行级触发器
begin
trigger_stmt; -- 触发器的具体内容
end

示例:

需求:

通过触发器记录emp表的数据变更日志,包含增加,修改,删除

首先创建一张日志表:

create table emp_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;

创建insert型触发器,完成插入数据时的日志记录;

DELIMITER $

CREATE TRIGGER emp_insert_trigger
AFTER INSERT
ON emp
FOR EACH ROW
BEGIN
	INSERT INTO emp_logs(id,operation,operate_time,operate_id,operate_params) 		VALUES(NULL,'insert',NOW(),new.id,CONCAT('插入后(id:',new.id,', name: 			',new.name,', age: ',new.age,', salary: ',new.salary,')'));
END$


	
DELIMITER ;	

测试:

insert into emp(id,name,age,salary) values(null,'光明左使',30,3500);

结果:
在这里插入图片描述

创建修改的触发器

DELIMITER $

CREATE TRIGGER emp_update_trigger
AFTER UPDATE
ON emp
FOR EACH ROW
BEGIN
	INSERT INTO emp_logs(id,operation,operate_time,operate_id,operate_params)VALUES(NULL,'update',NOW(),new.id,CONCAT('修改前(id:',old.id,', name: ',old.name,', age: ',old.age,', salary: ',old.salary,'), 修改后(id:',new.id,', name:',new.name,', age: ',new.age,', salary: ',new.salary,')'));
END$

DELIMITER ;	

测试:

update emp set age = 39 where id = 3;

结果:

在这里插入图片描述

删除触发器

DELIMITER $

CREATE TRIGGER emp_delete_trigger
AFTER DELETE
ON emp
FOR EACH ROW
BEGIN
	INSERT INTO emp_logs(id,operation,operate_time,operate_id,operate_params)VALUES(NULL,'delete',NOW(),old.id,CONCAT('删除前(id:',old.id,', name: ',old.name,', age: ',old.age,', salary: ',old.salary,')'));
END$

DELIMITER ;	

测试:

delete from emp where id = 7;

结果:
在这里插入图片描述

1.3删除触发器

语法结构:

drop trigger [schema_name.] trigger_name

如果没有指定的schema_name,默认为当前数据库

1.4查看触发器

可以通过执行SHOW TRIGGERS 命令查看触发器的状态,语法等信息.

语法结构:

show triggers;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!