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;
相关推荐
鸽芷咕1 天前
Oracle替换工程实践深度解析:金仓数据库破解PL/SQL“零改造”迁移难题
数据库·sql·oracle
猿小喵1 天前
MySQL数据库参数解读-第一篇
数据库·mysql·性能优化
云边有个稻草人1 天前
数据库性能调优实战:从瓶颈诊断到落地优化
网络·数据库·oracle·金仓·kes
小陈工1 天前
Python Web开发入门(二):Flask vs Django,项目结构大比拼
前端·数据库·python·安全·web安全·django·flask
wellc1 天前
Django视图与URLs路由详解
数据库·django·sqlite
倔强的石头1061 天前
新型电力系统应该用什么数据库?——时序数据库选型与落地实战
数据库·时序数据库
墨神谕1 天前
关系型数据库与非关系型数据库的区别
数据库·nosql
掌勺者1 天前
MySQL 事务简介
数据库·mysql
小码吃趴菜1 天前
服务器预约系统linux小项目-第四节课
数据库·sql·mysql
探索宇宙真理.1 天前
Grafana SQL表达式漏洞 | CVE-2026-27876概念复现&研究
数据库·sql·grafana