MySQL触发器
封面图
•
2025-12-13
•
MySQL
169
0
0
0
MySQL 触发器(Trigger)是一种**存储在数据库中的程序**,它会在特定的表上发生某些操作时自动执行。触发器可以用于**数据验证、审计日志、数据同步、自动更新等场景**。 --- ## 🧩 一、触发器的基本概念 ### 1. **触发事件(Event)** - `BEFORE INSERT`:在插入记录之前触发 - `AFTER INSERT`:在插入记录之后触发 - `BEFORE UPDATE`:在更新记录之前触发 - `AFTER UPDATE`:在更新记录之后触发 - `BEFORE DELETE`:在删除记录之前触发 - `AFTER DELETE`:在删除记录之后触发 ### 2. **触发对象(On Table)** - 触发器是绑定到某个表上的,比如 `table_name` ### 3. **触发时机(Timing)** - `BEFORE` 或 `AFTER` 指定触发器是在操作前还是操作后执行 --- ## ✅ 二、创建触发器语法 ```sql DELIMITER $$ CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name FOR EACH ROW BEGIN -- SQL语句 END$$ DELIMITER ; ``` > 注意:`DELIMITER $$` 是为了允许在触发器中使用分号(;),否则 MySQL 会提前结束语句。 --- ## 🔍 三、触发器示例 ### 示例 1:插入前检查数据 ```sql DELIMITER $$ CREATE TRIGGER check_salary BEFORE INSERT ON employees FOR EACH ROW BEGIN IF NEW.salary < 0 THEN SET NEW.salary = 0; END IF; END$$ DELIMITER ; ``` > 插入员工工资为负数时,自动设置为 0。 --- ### 示例 2:插入后更新其他表 ```sql DELIMITER $$ CREATE TRIGGER log_insert AFTER INSERT ON orders FOR EACH ROW BEGIN INSERT INTO order_logs (order_id, action, created_at) VALUES (NEW.id, 'Inserted', NOW()); END$$ DELIMITER ; ``` > 每次插入订单时,将操作记录到 `order_logs` 表中。 --- ### 示例 3:更新前修改数据 ```sql DELIMITER $$ CREATE TRIGGER update_status BEFORE UPDATE ON users FOR EACH ROW BEGIN SET NEW.status = 'updated'; END$$ DELIMITER ; ``` > 在更新用户信息前,自动将状态设为“updated”。 --- ## 🚫 四、触发器注意事项 1. **性能影响** - 触发器会增加数据库的负担,特别是在大量数据操作时。 - 避免在触发器中进行复杂或耗时的操作。 2. **事务控制** - 如果触发器中发生错误,可能会影响整个事务的提交。 3. **避免无限循环** - 触发器不能直接或间接地再次触发自身。 4. **权限问题** - 创建和使用触发器需要相应的权限(如 `TRIGGER` 权限)。 5. **调试困难** - 触发器逻辑隐藏在数据库中,不易调试。 --- ## 📦 五、查看和删除触发器 ### 查看所有触发器 ```sql SHOW TRIGGERS; ``` ### 查看某个表的触发器 ```sql SHOW TRIGGERS FROM database_name LIKE 'table_name'; ``` ### 删除触发器 ```sql DROP TRIGGER [IF EXISTS] trigger_name; ``` --- ## 📝 六、触发器与存储过程的区别 | 特性 | 触发器 | 存储过程 | |--------------|--------------------------------|-------------------------------| | 触发方式 | 自动触发(由数据库操作触发) | 手动调用(通过 SQL 调用) | | 使用场景 | 数据验证、审计、自动同步等 | 复杂业务逻辑处理 | | 作用范围 | 仅针对某张表 | 可跨表、跨数据库 | --- ## ✅ 七、适用场景总结 | 场景 | 触发器是否适用 | |-----------------------|----------------| | 自动更新审计日志 | ✅ | | 数据合法性校验 | ✅ | | 级联更新关联数据 | ✅ | | 生成唯一编号 | ✅ | | 复杂业务逻辑处理 | ❌(建议用存储过程)| --- 如果你有具体的使用场景或遇到问题,欢迎告诉我,我可以帮你写一个合适的触发器!
上一篇:
MySQL(主从配置)
下一篇:
mysql8.0 使用 x509设置加密连接
标题录入,一次不能超过6条
留言
评论