MySQL 触发器

1、概念介绍

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

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

2、触发器操作

创建触发器

复制代码
DELIMITER $

-- 创建
CREATE TRIGGER tigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON table_name FOR EACH ROW -- 行级触发器
BEGIN
	tigger_stmt
END$

DELIMITER ;

查看触发器:SHOW TRIGGERS;

删除触发器:DROP TRIGGER [schema_name.]tigger_name;

3、触发器类型

需求:通过触发器记录tb_user表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加,修改,删除;

复制代码
# 创建日志表 user_logs
CREATE TABLE user_logs(
	id INT(11) PRIMARY KEY 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 '操作参数'
) ENGINE=INNODB DEFAULT CHARSET=utf8;
a. INSERT 触发器
复制代码
DELIMITER $

CREATE TRIGGER tb_user_insert_trigger
AFTER INSERT ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_logs VALUES(NULL, 'insert', NOW(), new.id, 
	CONCAT('插入的数据内容为:id=', new.id, ',name=',new.name,',phone=',
	new.phone, ',email=',new.email, ',profession=', new.profession));
END$

DELIMITER ;

-- 查看触发器 
SHOW TRIGGERS;

-- 删除触发器
DROP TRIGGER tb_user_insert_trigger;

-- 验证插入触发器,插入数据到tb_user
INSERT INTO tb_user(id, NAME, phone, email, profession, age, gender, STATUS, createtime)
VALUES (25,'二皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',NOW());
b. UPDATE 触发器
复制代码
DELIMITER $

CREATE TRIGGER tb_user_update_trigger
AFTER UPDATE ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_logs 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$

DELIMITER ;

-- 查看触发器 
SHOW TRIGGERS;

-- 验证修改触发器,修改tb_user表中的数据
UPDATE tb_user SET profession = '云计算运维工程师' WHERE id = 23;
-- update触发器,触发了5次
UPDATE tb_user SET profession = '云计算运维工程师' WHERE id < 5;
c. DELETE 触发器
复制代码
DELIMITER $

CREATE TRIGGER tb_user_delete_trigger
AFTER DELETE ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_logs VALUES(NULL, 'delete', NOW(), old.id, 
	CONCAT('删除之前的数据:id=', old.id, ',name=',old.name,',phone=',old.phone, ',email=',old.email, ',profession=', old.profession));
END$

DELIMITER ;

-- 查看触发器 
SHOW TRIGGERS;

-- 验证删除触发器
DELETE FROM tb_user WHERE id = 25;
相关推荐
程序新视界4 分钟前
一篇文章全面重温MySQL的join操作
mysql
BYSJMG14 分钟前
计算机毕设选题:基于Python+MySQL校园美食推荐系统【源码+文档+调试】
大数据·开发语言·python·mysql·django·课程设计·美食
不爱洗脚的小滕15 分钟前
【Redis】Scan 命令使用教程:高效遍历海量数据
数据库·redis·bootstrap
宁小法1 小时前
MySQL - 全表扫描 会发生死锁?
数据库·mysql·死锁·存储引擎·全表扫描
瑜伽娃娃1 小时前
基于Redis设计一个高可用的缓存
数据库·redis·缓存
叫我龙翔1 小时前
【MySQL】从零开始了解数据库开发 --- 数据类型
数据库·mysql·数据库开发
睡觉的时候不会困7 小时前
Redis 主从复制详解:原理、配置与主从切换实战
数据库·redis·bootstrap
程序员的世界你不懂8 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
自学也学好编程9 小时前
【数据库】Redis详解:内存数据库与缓存之王
数据库·redis
福赖9 小时前
《MySQL基础——用户管理》
mysql·用户管理