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;
来源:CSDN
作者:奋斗的小菜菜
链接:https://blog.csdn.net/qq_40539437/article/details/104108504