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

MySQL删除父表记录时触发删除关联子表的触发器报错解决

MySQL删除父表时触发器级联删除子表的正确写法

原有代码错误原因

你遇到的1054: Unknown column 'prueba_luisdi.parent.id' in 'where clause'报错,核心是触发器代码存在两个语法错误:

  • 反引号使用错误:MySQL里反引号仅用于包裹单个标识符(库名、表名、列名),你写的`child.id_parent`会被数据库识别为「名称为child.id_parent的单个列」,自然找不到对应字段。正确的多标识符关联写法应该是`child`.`id_parent`,如果SQL上下文没有重名列,甚至可以省略表名前缀直接写列名。
  • 触发器内取值语法错误:在DELETE类型的触发器中,要获取被删除行的字段值,必须使用OLD.字段名的固定语法。parent表的主键字段是id,所以被删除的父记录ID应该取OLD.id,你之前写的parent.id属于直接查表的写法,在触发器逐行执行的上下文里不会被正确解析;尝试写的OLD.parent_id也不成立,因为parent表本身不存在parent_id字段。

另外触发器时机选BEFORE DELETE是正确的,不需要改成AFTER,如果child表和parent表之间建了普通外键(未开级联),AFTER时机触发前外键校验就会先报错拦截删除操作。

正确触发器代码

DELIMITER $$

CREATE TRIGGER parent_deleted
BEFORE DELETE
ON parent FOR EACH ROW
BEGIN
    -- 如果需要记录删除日志,可以在这一步先将匹配的child记录查询插入log_changes表,再执行删除
    DELETE FROM child WHERE `id_parent` = OLD.id;
END$$

DELIMITER ;

创建完上述触发器后,再执行删除parent记录的语句,就会自动删除所有关联的child表记录,不会再报1054未知列的错误。
如果需要实现删除日志记录,只需要在BEGIN块内的DELETE语句前,增加对应的插入日志逻辑即可,示例:

-- 示例:将待删除的子记录写入操作日志表
INSERT INTO log_changes(table_name, operate_type, record_id, operate_time)
SELECT 'child', 'delete', id, NOW() FROM child WHERE id_parent = OLD.id;

内容的提问来源于stack exchange,提问作者luis rondon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:39:22