MySQL触发器报错1054:OLD中不存在'anterior_código'列的问题
解决MySQL触发器错误:Error Code: 1054. Unknown column 'anterior_código' in 'OLD'
错误原因
触发器代码里的OLD.anterior_código、NEW.nuevo_código写法完全错误。OLD和NEW是触发器中引用**原表inventario**数据的关键字,原表的字段是código、producto、precio、cantidad,根本不带anterior_或nuevo_前缀——这些前缀是备份表inventario_respaldo的列名,不能直接套在OLD/NEW的字段引用上。
修正后的完整代码
CREATE TABLE inventario ( código VARCHAR(4) PRIMARY KEY, producto VARCHAR(10) UNIQUE NOT NULL, precio INT NOT NULL, cantidad INT UNSIGNED NOT NULL ); CREATE TABLE inventario_respaldo ( anterior_código VARCHAR(4), anterior_producto VARCHAR(10) UNIQUE NOT NULL, anterior_precio INT NOT NULL, anterior_cantidad INT UNSIGNED NOT NULL, nuevo_código VARCHAR(4), nuevo_producto VARCHAR(10) UNIQUE NOT NULL, nuevo_precio INT NOT NULL, nuevo_cantidad INT UNSIGNED NOT NULL, usuario VARCHAR(20), fecha DATETIME ); INSERT INTO inventario VALUES ('AT01', 'Bicicleta', 200, 20), ('AT02', 'Microondas', 100, 10), ('AT03', 'Lavamanos', 150, 5); -- 先创建触发器,再执行UPDATE才会触发备份逻辑 DELIMITER // CREATE TRIGGER trigger_respaldo BEFORE UPDATE ON inventario FOR EACH ROW BEGIN INSERT INTO inventario_respaldo ( anterior_código, anterior_producto, anterior_precio, anterior_cantidad, nuevo_código, nuevo_producto, nuevo_precio, nuevo_cantidad, usuario, fecha ) VALUES ( OLD.código, OLD.producto, OLD.precio, OLD.cantidad, NEW.código, NEW.producto, NEW.precio, NEW.cantidad, CURRENT_USER(), NOW() ); END // DELIMITER ; -- 现在执行UPDATE会触发触发器写入备份记录 UPDATE inventario SET cantidad = 90 WHERE código = 'AT02';
额外说明
OLD存储的是UPDATE操作前原表的旧数据,对应备份表的anterior_*列;NEW存储的是UPDATE操作后将要写入的新数据,对应备份表的nuevo_*列。- 原代码中UPDATE语句写在触发器创建之前,这部分UPDATE不会触发备份逻辑,修正后调整了顺序,确保触发器生效后再执行数据修改。
内容的提问来源于stack exchange,提问作者Naujel
相关产品推荐
相关产品推荐

