触发器是MySQL中与表绑定的特殊存储过程,在INSERT、UPDATE或DELETE操作发生时自动执行。它可在BEFORE或AFTER时机触发,常用于数据验证、日志记录等。通过CREATE TRIGGER定义,使用OLD和NEW引用旧值与新值,每行变化触发一次。示例中更新users表会自动向user_logs插入日志。可用SHOW TRIGGERS查看,DROP TRIGGER删除。注意不能在触发器中修改同表或使用事务控制语句,且需避免性能问题。

在 MySQL 中,触发器(Trigger)是一种特殊的存储过程,它会在表上发生特定事件(如 INSERT、UPDATE 或 DELETE)时自动执行。触发器常用于数据验证、日志记录、自动更新字段等场景。
什么是触发器
触发器是与表绑定的数据库对象,不需要手动调用。只要对表执行指定操作,满足条件就会“触发”预定义的 SQL 语句。
触发器的关键特性:
- 绑定到某张表
- 在特定时间点执行(BEFORE 或 AFTER)
- 响应 INSERT、UPDATE、DELETE 操作
创建触发器语法
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] BEGIN -- 触发器逻辑 END;说明:
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
- trigger_name:触发器名称,需在当前数据库中唯一
- trigger_time:触发时机,可选 BEFORE 或 AFTER
- trigger_event:触发事件,INSERT、UPDATE 或 DELETE
- table_name:关联的表名
- FOR EACH ROW:每行数据变化都会触发一次
- BEGIN ... END:包含触发器要执行的多条语句
触发器使用示例
假设我们有两个表:users 和 user_logs,当用户信息被更新时,自动记录日志。
1. 创建表结构
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE user_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
change_desc TEXT,
change_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
2. 创建触发器
DELIMITER $$
CREATE TRIGGER after_user_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, change_desc)
VALUES (OLD.id, CONCAT('Updated user from ', OLD.name, ' to ', NEW.name));
END$$
DELIMITER ;
说明:
- OLD 表示更新前的数据(仅 UPDATE 和 DELETE 可用)
- NEW 表示更新后的数据(仅 INSERT 和 UPDATE 可用)
- DELIMITER $$ 用于更改语句结束符,避免与内部分号冲突
3. 测试触发器
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
UPDATE users SET name = 'Alice Wang' WHERE id = 1;
SELECT * FROM user_logs;
执行后,user_logs 表会新增一条日志记录。
查看和删除触发器
查看当前数据库所有触发器:
SHOW TRIGGERS;
查看特定表的触发器:
SELECT * FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_TABLE = 'users';
删除触发器:
DROP TRIGGER IF EXISTS after_user_update;
注意事项与限制
- 触发器不能对临时表或视图创建
- 不能在触发器中使用 START TRANSACTION、COMMIT 或 ROLLBACK
- 避免在触发器中修改正在操作的同一张表(会报错)
- 过度使用可能影响性能,应谨慎设计
基本上就这些。合理使用触发器能提升数据一致性与自动化能力,但也要注意维护复杂度。不复杂但容易忽略的是 OLD 和 NEW 的使用时机,务必根据事件类型正确引用。








