MySQL触发器报错Error 1054:未知列gps_coordinates求助
解决MySQL触发器Error Code: 1054的问题
嘿,你的问题其实很典型——报错Error Code: 1054. Unknown column 'gps_coordinates' in 'field list'是因为在触发器里引用原有列值时没加前缀!
在MySQL的BEFORE UPDATE触发器里,如果你要访问更新前的旧值,必须用OLD.列名来引用;而要访问即将设置的新值,才用NEW.列名。你之前直接写gps_coordinates,MySQL根本不知道你指的是旧值还是新值,自然会报错找不到这个列。
你的需求是把previous_gps_coordinates设为gps_coordinates的原有值,那核心就是要把gps_coordinates改成OLD.gps_coordinates。下面给你修正后的几种写法,对应你之前的两种逻辑:
情况1:无条件将旧GPS值存入previous列
如果每次更新都要把旧的gps_coordinates存到previous_gps_coordinates,不需要判断条件的话,代码可以简化成这样:
DELIMITER $$ CREATE TRIGGER GPSUPDATE BEFORE UPDATE ON sys_reference.location_reference FOR EACH ROW BEGIN SET NEW.previous_gps_coordinates := OLD.gps_coordinates; END$$ DELIMITER ;
情况2:仅当previous_gps_coordinates为NULL时赋值
对应你第二种尝试的逻辑,修正后:
DELIMITER $$ CREATE TRIGGER GPSUPDATE BEFORE UPDATE ON sys_reference.location_reference FOR EACH ROW BEGIN IF NEW.previous_gps_coordinates IS NULL THEN SET NEW.previous_gps_coordinates := OLD.gps_coordinates; END IF; END$$ DELIMITER ;
情况3:仅当previous_gps_coordinates >=0时赋值
对应你第一种尝试的逻辑,这里要注意:如果previous_gps_coordinates是NULL的话,NULL >=0会返回NULL,也就是不满足条件,所以只有当它是大于等于0的数值时才会执行赋值:
DELIMITER $$ CREATE TRIGGER GPSUPDATE BEFORE UPDATE ON sys_reference.location_reference FOR EACH ROW BEGIN IF NEW.previous_gps_coordinates >= 0 THEN SET NEW.previous_gps_coordinates := OLD.gps_coordinates; END IF; END$$ DELIMITER ;
最后再提醒下:触发器里一定要区分OLD和NEW的用法,这是MySQL触发器的基础规则,搞混了就容易出这类列不存在的错误~
内容的提问来源于stack exchange,提问作者Leon Claassen
相关产品推荐
相关产品推荐

