DELETE语句执行无报错但无法删除数据,请求排查解决
问题排查方案
核心错误点
你当前代码里用results.insertId作为DELETE操作的返回值是完全错误的——DELETE语句不会生成insertId,这会导致你无法正确判断是否有行被删除。应该改用results.affectedRows来获取实际被删除的行数,这是第一个需要修正的地方。
逐步排查步骤
- 先确认
results.affectedRows的值:运行代码后查看控制台输出的results对象,如果affectedRows为0,说明SQL在代码执行时没有匹配到任何行;如果为1,那问题出在你后续的业务逻辑(而非删除操作本身)。 - 检查数据库字段类型与参数类型是否匹配:即使你认为参数值正确,也要核对数据库中
user_id、question_id、answer_id的字段类型(比如是INT还是VARCHAR)。如果数据库字段是字符串类型,但你传入的是数字,可能会因为隐式转换失败导致匹配不到行;另外确认answer_id字段是否允许NULL值。 - 验证连接池的数据库环境:你手动执行SQL的数据库,和代码中连接池指向的数据库是否为同一个?比如代码连测试库,你手动操作的是生产库,自然看不到删除效果。
- 查看实际执行的SQL:开启MySQL的通用查询日志,记录代码执行的完整SQL语句,确认参数是否被正确替换。比如NULL参数是否被处理成了数据库能识别的
NULL,而非字符串'null'。 - 核对调用逻辑:检查调用
removeFavorite的代码,确认参数顺序是否正确(比如有没有把question_id和answer_id传反)。
修正后的代码示例
removeFavorite(user_id: number, question_id: number, answer_id: number | null) { return new Promise<number>((resolve, reject) => { pool.query( 'DELETE FROM favorites WHERE user_id=? AND question_id=? AND answer_id=?', [user_id, question_id, answer_id], (error, results: ResultSetHeader) => { if (error) return reject(error); console.log('删除参数:', user_id, question_id, answer_id); console.log('执行结果:', results); // 返回受影响行数,而非insertId resolve(results.affectedRows); }, ); }); }
内容的提问来源于stack exchange,提问作者TMK1k
相关产品推荐
相关产品推荐

