MySQL日志触发器异常:删除记录后未填充removed_trades_log表
排查MySQL删除触发器不生效的步骤
按以下顺序逐一排查问题:
1. 先确认触发器是否真的创建成功并关联正确
执行SQL查看触发器状态:
SELECT trigger_name, event_manipulation, event_object_table FROM information_schema.triggers WHERE trigger_name = 'log_data';
- 如果无结果返回,说明触发器创建失败;
- 如果有结果,确认
event_object_table是trades,event_manipulation为DELETE。
2. 修复触发器语法错误
你提供的触发器代码中,INSERT语句末尾缺少分号,这会导致触发器创建失败(部分MySQL版本可能不会直接报错,但实际未生成有效触发器)。修正后的完整代码:
DROP TRIGGER IF EXISTS log_data; -- 先删除旧触发器(如果存在) DELIMITER // CREATE TRIGGER log_data AFTER DELETE ON trades FOR EACH ROW BEGIN INSERT INTO removed_trades_log VALUES (old.trade_id, NOW()); -- 补充分号 END // DELIMITER ;
3. 验证日志表结构匹配
检查removed_trades_log的字段类型、顺序是否和插入值匹配:
DESCRIBE removed_trades_log;
需满足:
- 第一个字段类型与
trades.trade_id一致(比如同为VARCHAR类型); - 第二个字段为日期时间类型(
DATETIME/TIMESTAMP),且允许非空或有默认值。
类型不匹配会导致插入静默失败(严格模式关闭时)。
4. 确认删除操作真的命中了记录
执行删除后,检查目标记录是否真的被删除:
SELECT * FROM trades WHERE trade_id = 'T1008';
如果这条记录原本不存在,DELETE会提示“受影响的行: 0”,触发器不会触发。
5. 排查事务回滚问题
如果删除操作是在事务中执行,之后又执行了ROLLBACK,触发器的插入操作会被一并回滚,日志表会保持为空。
6. 检查权限与SQL模式
- 确认创建触发器的用户拥有
TRIGGER权限,以及removed_trades_log表的INSERT权限; - 检查
sql_mode中未设置NO_TRIGGERS(该模式会禁用触发器)。
内容的提问来源于stack exchange,提问作者prany24
相关产品推荐
相关产品推荐

