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
相关产品推荐
相关产品推荐

