MySQL触发器
MySQL触发器简介
MySQL触发器(Trigger)是一种与表事件(如INSERT、UPDATE、DELETE)绑定的数据库对象,当特定事件发生时自动执行预定义的SQL逻辑。触发器通常用于数据一致性维护、审计日志记录、业务规则强制执行等场景。
触发器的核心特性
- 事件驱动:绑定到表的INSERT、UPDATE或DELETE操作前(BEFORE)或后(AFTER)。
- 自动执行:无需手动调用,由数据库引擎触发。
- 事务关联:触发器执行失败会导致整个操作回滚(若在事务中)。
触发器的基本语法
创建触发器的标准语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
BEGIN-- 触发器逻辑(SQL语句)
END;
触发器的常见使用场景
数据审计与日志记录
在关键表上创建触发器,记录数据的修改历史。例如:
CREATE TRIGGER audit_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGININSERT INTO audit_log (action, table_name, record_id, changed_at)VALUES ('UPDATE', 'employees', OLD.id, NOW());
END;
业务规则校验
强制执行业务逻辑,如在插入订单前检查库存:
CREATE TRIGGER check_inventory_before_order
BEFORE INSERT ON orders
FOR EACH ROW
BEGINDECLARE inventory_count INT;SELECT quantity INTO inventory_count FROM products WHERE id = NEW.product_id;IF inventory_count < NEW.quantity THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不足';END IF;
END;
数据同步与派生字段
自动更新关联表的数据。例如,订单总价变动时同步更新统计表:
CREATE TRIGGER sync_order_total
AFTER UPDATE ON orders
FOR EACH ROW
BEGINIF NEW.total_amount != OLD.total_amount THENUPDATE order_stats SET total_revenue = total_revenue + (NEW.total_amount - OLD.total_amount);END IF;
END;
级联操作限制
替代外键的级联删除,实现更复杂的约束:
CREATE TRIGGER prevent_cascade_delete
BEFORE DELETE ON departments
FOR EACH ROW
BEGINIF EXISTS (SELECT 1 FROM employees WHERE department_id = OLD.id) THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '部门下存在员工,禁止删除';END IF;
END;
触发器的注意事项
- 性能影响:频繁触发的复杂逻辑可能降低数据库性能。
- 调试困难:触发器错误可能隐式发生,需通过日志排查。
- 避免递归:触发器内操作可能触发其他触发器,导致死循环。
触发器的管理命令
- 查看触发器:
SHOW TRIGGERS FROM database_name;
- 删除触发器:
DROP TRIGGER IF EXISTS trigger_name;