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','[email protected]','软件工程',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;
相关推荐
XY.散人18 分钟前
初识Redis · list和hash类型
数据库·redis·哈希算法
Arbori_2621518 分钟前
Oracle WITH 子句(也称为 公共表表达式,Common Table Expression,CTE)
数据库·oracle
Tapdata33 分钟前
拒绝停服, 随时回退:Sybase 到 Postgresql 的无缝数据库双向迁移方案
数据库
moxiaoran57531 小时前
mysql自动赋值
数据库·mysql
结衣结衣.1 小时前
【MySQL】数据库基础
数据库·mysql
博界IT精灵1 小时前
SQL语言
数据库·sql
小样vvv1 小时前
【微服务管理】注册中心:分布式系统的基石
java·数据库·微服务
struggle20251 小时前
Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
数据库·人工智能·学习·3d·开源·自动化
看海的四叔1 小时前
【SQL】MySql常见的性能优化方式
hive·sql·mysql·性能优化·数据分析·索引优化·sql语法
路在脚下@2 小时前
Spring Boot项目中结合MyBatis实现MySQL的自动主从切换
spring boot·mysql·mybatis