MySQL触发器

视图/存储过程/触发器

触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触

发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性

, 日志记录 , 数据校验等操作 。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还

只支持行级触发,不支持语句级触发。

语法

1). 创建

java 复制代码
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
trigger_stmt ;
END;

2). 查看

java 复制代码
SHOW TRIGGERS ;

3). 删除

java 复制代码
DROP TRIGGER [schema_name.]trigger_name ; -- 如果没有指定 schema_name,默认为当前数
据库 。

案例

通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中, 包含增加,

修改 , 删除 ;

表结构准备:

java 复制代码
-- 准备工作 : 日志表 user_logs
create table 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;

A. 插入数据触发器

java 复制代码
create trigger tb_user_insert_trigger
after insert on tb_user for each row
begin
insert into 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));
end;

测试:

java 复制代码
-- 查看
show triggers ;
-- 插入数据到tb_user
insert into tb_user(id, name, phone, email, profession, age, gender, status,
createtime) VALUES (26,'三皇子','18809091212','erhuangzi@163.com','软件工
程',23,'1','1',now());

测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。

B. 修改数据触发器

java 复制代码
create trigger tb_user_update_trigger
after update on tb_user for each row
begin
insert into 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,
' | 更新之后的数据: id=',new.id,',name=',new.name, ', phone=',
NEW.phone, ', email=', NEW.email, ', profession=', NEW.profession));
end;

测试:

java 复制代码
-- 查看
show triggers ;
-- 更新
update tb_user set profession = '会计' where id = 23;
update tb_user set profession = '会计' where id <= 5;

测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。

C. 删除数据触发器

java 复制代码
create trigger tb_user_delete_trigger
after delete on tb_user for each row
begin
insert into 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));
end;

测试:

java 复制代码
-- 查看
show triggers ;
-- 删除数据
delete from tb_user where id = 26;

测试完毕之后,检查日志表中的数据是否可以正常插入,以及插入数据的正确性。

相关推荐
南城花随雪。15 分钟前
Redis(非关系型数据库)详细介绍
数据库·redis·nosql
冰红茶兑滴水23 分钟前
MySQL 内置函数
数据库·mysql
鸿·蒙28 分钟前
【PTA】【数据库】【SQL命令】编程题2
数据库·sql·pta
J.P.August42 分钟前
Oracle RAC 环境下数据文件误建在本地目录的处理过程
数据库·oracle
ThisIsClark43 分钟前
【后端面试总结】MySQL面试总结
mysql·面试·职场和发展
对酒当歌丶人生几何1 小时前
Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)
java·数据库·sql·mybatis
ThisIsClark1 小时前
【后端面试总结】MySQL索引
mysql·面试·职场和发展
LightOfNight2 小时前
Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
服务器·数据库·redis·分布式·后端·缓存·中间件
代码中の快捷键2 小时前
MySQL数据库存储引擎的数据结构
数据结构·数据库·mysql
Adolf_19932 小时前
Django 路由层
数据库