You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复animal_delete_func(),使其将删除的动物记录存入deleted_animals表?

问题修复方案

核心问题分析

  1. 触发器语法错误:MySQL中关联触发函数不能用CALL,需使用EXECUTE FUNCTION语法绑定函数与触发器。
  2. 无效子查询导致数据丢失:AFTER DELETE触发时,被删除的行已从animals表移除,此时通过子查询SELECT animal_name FROM animals WHERE animal_id = OLD.animal_id会返回NULL。实际上OLD对象已包含被删除行的所有字段,直接调用即可。
  3. 函数定义的分隔符问题:创建包含多语句的触发函数时,未提前修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:22:15