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 分钟前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北1 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12023 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端