08.触发器
2024/10/3大约 2 分钟
08.触发器
触发器:相当于事件侦听器,当数据库发生特定的事件后,触发器被触发,完成相应的处理
因为主键变化带来的外键更新不会触发从表触发器
创建触发器的语法:
MySQLCREATE TRIGGER 触发器名 [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON 表名 -- 仅支持每行都触发 FOR EACH ROW -- 执行语块可以是单条语句,也可以是BEGIN END复合语句块 -- 在这里可以使用NEW 和 OLD 访问新旧数据,比如 NEW.id 触发器执行语块; -- 创建BEFORE INSERT触发器实现验证的示例 DELIMITER // CREATE TRIGGER before_employee_insert BEFORE INSERT ON employees FOR EACH ROW BEGIN -- 自动设置创建时间 SET NEW.created_at = NOW(); -- 确保邮箱小写 SET NEW.email = LOWER(NEW.email); -- 薪资验证 IF NEW.salary < 0 THEN SET NEW.salary = 0; END IF; END// DELIMITER ;查看触发器
-- 查看触发器 SHOW TRIGGERS; -- 查看某个触发器的定义 SHOW CREATE TRIGGER 触发器名; -- 查看所有的触发器 (所有数据库) SELECT * FROM information_schema.TRIGGERS;删除触发器:触发器无法停用,只能通过删除取消
DROP TRIGGER IF EXISTS 触发器名;触发器可以用于保证数据完整性、对插入的数据进行完整性验证,也可以记录操作日志,但触发器也有许多缺点:
- 触发器可读性差,创建时不会验证触发器流程是否正确,可能会导致莫名其妙的错误,触发器中抛出的错误会导致触发触发器的事务回滚
- 触发器和表结构相关,如果表结构更改,相关触发器可能报错
- 触发器虽然无法触发自身,但可能导致间接无限循环触发
- 触发可能影响大批量操作的性能,尤其是对每行触发
