首页 > 解决方案 > UPDATE 查询不更改 MySQL 数据库中的数据

问题描述

我正在 express.js 中编写一个应用程序。我正在使用“mysql”附加组件(https://www.npmjs.com/package/mysql)。我正在发送一个 UPDATE 查询。服务器返回给我:

{"fieldCount": 0, "affectedRows": 1, "insertId": 0, "serverStatus": 2, "warningCount": 0, 
"message": "(Rows matched: 1 Changed: 0 Warnings: 0", " protocol41 ": true," changedRows ": 0}

我将查询复制到 phpMyAdmin 并正确执行 - 它更改了数据库中的数据。我在哪里犯错?

我发送:“UPDATE measurementsSET sugar_level= '429', insulin_dose= '200', hour_of_measurement= '20', date_of_measurement= '2019-07-29' WHERE measurements. ID= '14'” 查询:INSERT INTO,DELETE FROM,SELECT 工作正常

标签: javascriptmysqlnode.jsexpressvue.js

解决方案


看起来 UPDATE 语句找到了满足 WHERE 子句中条件的一行。如果条件是主键或唯一键列上的相等,这似乎是合理的,例如

 UPDATE ... WHERE t.id = ?

如果分配给列的所有值都与已存储的值匹配,则 MySQL 将报告该行未更改。这样的查询是合理的

UPDATE mytable SET mycol = mycol

匹配表中的所有行,并更改零行。

请注意,为受影响的行返回的值是匹配行的值。

matchRows 具有与 changedRows 不同的值是合理的。

注意:BEFORE UPDATE 触发器可能会影响 NEW.mycol 值,因此在这种情况下,更改大量行是合理的。

serverStatus 值 2 告诉我们启用了自动提交。


底线:如果我们要运行查询,来自 MySQL 服务器的响应是我们所期望的

 UPDATE mytable SET mycol = mycol WHERE id = ?

我们在表中找到恰好匹配条件的一行,但在执行分配之后,结果行与语句开头的行相同,即没有对排。


跟进

UPDATE measurements 
   SET sugar_level         = '429'
     , insulin_dose        = '200'
     , hour_of_measurement = '20'
     , date_of_measurement = '2019-07-29'
 WHERE measurements.ID = '14'

假设表中有一行 ID 值为 14,并假设表上没有 BEFORE UPDATE 触发器,并且将值分配给列

那么这个语句的执行“匹配”一行并“改变”零行是完全合理的。特别是在第二次执行之后。如果我们要实际更改其中一个值,例如将sugar_level 更改为“430”,那么我们会期望看到更改的行。


我强烈怀疑 MySQL 是否按照规范运行(即“正确执行”)。

(不清楚为什么 OP 认为返回的结果不正确,或者认为操作执行不正确。)


推荐阅读