**一、触发器的基本语法**
sql
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name FOR EACH ROW
BEGIN
-- 触发器执行的 SQL 语句
END;
- **`BEFORE`/`AFTER`**:指定触发器在事件之前或之后执行。
- **`INSERT`/`UPDATE`/`DELETE`**:触发事件类型。
- **`FOR EACH ROW`**:表示对每一行数据执行一次触发器(MySQL 仅支持行级触发器)。
- **`OLD` 和 `NEW`**:
- **`OLD`**:在 `UPDATE`/`DELETE` 时引用旧数据(如 `OLD.column_name`)。
- **`NEW`**:在 `INSERT`/`UPDATE` 时引用新数据(如 `NEW.column_name`)。
**二、触发器类型及示例**
**1. INSERT 触发器**
**场景**:记录用户注册时间。
sql
CREATE TRIGGER log_user_registration
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, created_at)
VALUES (NEW.id, '注册', NOW());
END;
**2. UPDATE 触发器**
**场景**:防止修改已锁定的用户账户。
sql
CREATE TRIGGER prevent_locked_user_update
BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
IF OLD.is_locked = 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '无法修改已锁定的用户';
END IF;
END;
**3. DELETE 触发器**
**场景**:删除用户前记录删除日志。
sql
CREATE TRIGGER log_user_deletion
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_logs (user_id, action, deleted_data, created_at)
VALUES (OLD.id, '删除', CONCAT('姓名:', OLD.name, '; 邮箱:', OLD.email), NOW());
END;
**三、查看和删除触发器**
**1. 查看触发器**
sql
SHOW TRIGGERS; -- 查看所有触发器
SHOW TRIGGERS LIKE 'user_%'; -- 查看特定模式的触发器
**2. 删除触发器**
sql
DROP TRIGGER IF EXISTS trigger_name;
**四、触发器的限制和注意事项**
1. **性能影响**:触发器会在每次执行相关操作时自动触发,可能影响数据库性能。
2. **递归触发**:触发器内部若再次修改表数据,可能导致递归触发,需谨慎设计。
3. **事务处理**:触发器在事务中执行,若失败会导致整个事务回滚。
4. **兼容性**:触发器是数据库层面的实现,不同数据库(如 MySQL、PostgreSQL)的语法可能有差异。
**五、替代方案**
复杂的业务逻辑建议通过应用层代码实现,而非触发器,原因如下:
- 代码可维护性更高。
- 便于调试和测试。
- 减少数据库负担。
**六、总结**
触发器适用于简单的数据完整性约束或自动化日志记录,但应避免过度使用。在设计触发器时,需考虑性能和业务逻辑的复杂度,权衡是否通过应用层代码实现更好。