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;
相关推荐
kejiayuan38 分钟前
CTE更易懂的SQL风格
数据库·sql
kaico201842 分钟前
MySQL的索引
数据库·mysql
清水白石0081 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔1 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
PyHaVolask2 小时前
SQL注入漏洞原理
数据库·sql
ptc学习者2 小时前
黑格尔时代后崩解的辩证法
数据库
代码游侠2 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
!chen2 小时前
EF Core自定义映射PostgreSQL原生函数
数据库·postgresql
霖霖总总3 小时前
[小技巧14]MySQL 8.0 系统变量设置全解析:SET GLOBAL、SET PERSIST 与 SET PERSIST_ONLY 的区别与应用
数据库·mysql
马克学长3 小时前
SSM校园食堂订餐系统531p9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·ssm 校园食堂订餐系统