如何修复animal_delete_func(),使其将删除的动物记录存入deleted_animals表?
问题修复方案
核心问题分析
- 触发器语法错误:MySQL中关联触发函数不能用
CALL,需使用EXECUTE FUNCTION语法绑定函数与触发器。 - 无效子查询导致数据丢失:
AFTER DELETE触发时,被删除的行已从animals表移除,此时通过子查询SELECT animal_name FROM animals WHERE animal_id = OLD.animal_id会返回NULL。实际上OLD对象已包含被删除行的所有字段,直接调用即可。 - 函数定义的分隔符问题:创建包含多语句的触发函数时,未提前修改SQL分隔符,会导致MySQL误判函数结束位置,引发语法错误。
修复后的完整代码
1. 修正触发函数
DELIMITER $$ CREATE FUNCTION animal_delete_func() RETURNS TRIGGER BEGIN -- 删除该动物的喂食计划 DELETE FROM feeding_schedule WHERE animal_id = OLD.animal_id; -- 删除该动物的食物记录 DELETE FROM food WHERE animal_id = OLD.animal_id; -- 插入已删除动物记录表,直接使用OLD对象的字段 INSERT INTO deleted_animals (animal_id, animal_name, date_deleted) VALUES (OLD.animal_id, OLD.animal_name, NOW()); RETURN OLD; END$$ DELIMITER ;
2. 修正触发器
CREATE TRIGGER animal_delete_trigger AFTER DELETE ON animals FOR EACH ROW EXECUTE FUNCTION animal_delete_func();
额外验证项
请确认deleted_animals表的结构与插入字段匹配:
- 存在
animal_id、animal_name、date_deleted字段 date_deleted字段类型为DATETIME或TIMESTAMP,确保能接收NOW()的返回值
内容的提问来源于stack exchange,提问作者Karanveer
相关产品推荐
相关产品推荐

