MySQL UPDATE语句WHERE子句报错:未知列'CR0001'问题排查
解决MySQL UPDATE语句WHERE子句的"Unknown column"错误
这个问题我碰到过好多次啦——你遇到的错误根源其实很简单:字符串类型的字段值没有用引号包裹,MySQL把CR0001当成了一个列名,而不是id_scooter字段的目标取值,所以才会抛出“Unknown column 'CR0001' in 'where clause'”的报错。
问题代码的核心问题
你原来的SQL语句是这样的:
var update = "UPDATE coordonate SET ? WHERE id_scooter=CR0001 ";
这里的CR0001是字符串类型的ID值,但你没加引号,MySQL会默认把它解析成列名,自然找不到这个列。另外还有个小细节:你在SET的参数对象里包含了id_scooter: array[0],但实际上你是要根据id_scooter来更新其他字段,这个字段本身不需要被更新,反而会造成冗余。
推荐的修正方案(参数化查询,安全又规范)
最好的做法是用参数化查询处理WHERE子句的取值,既解决引号问题,又能彻底避免SQL注入风险。修改后的代码如下:
// 用两个占位符分别对应SET的字段集合和WHERE的id_scooter取值 var update = "UPDATE coordonate SET ? WHERE id_scooter=? "; con.query(update, [ // 第一个参数:要更新的字段集合(去掉不需要更新的id_scooter) { lat: array[3], longi: array[4], alt: array[5], ip: rinfo.address, port: rinfo.port, speed: array[6], nr_satelites: array[2], battery_lvl: array[1] }, // 第二个参数:WHERE子句中id_scooter的目标取值 array[0] ], function (err, result) { if (err) throw err; console.log("Number of records updated: " + result.affectedRows); } );
我还把日志里的“inserted”改成了“updated”,毕竟这是UPDATE操作,表述更准确~
不推荐的临时写法(直接加引号)
如果你只是想快速验证功能,也可以给CR0001加上单引号,但这种写法如果CR0001是动态变量的话,会有SQL注入风险,绝对不建议在生产环境使用:
var update = "UPDATE coordonate SET ? WHERE id_scooter='CR0001' ";
内容的提问来源于stack exchange,提问作者florinstefan8830
相关产品推荐
相关产品推荐

