javascript - 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 measurements
SET 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 工作正常
解决方案
看起来 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 认为返回的结果不正确,或者认为操作执行不正确。)
推荐阅读
- javascript - 将索引推入数组而不覆盖数组
- c# - 默认情况下阻止 Serilog 写入 HTTP 事件
- javascript - 在没有复选框的情况下使 ag-grid 行可选
- python - 将相关性的负结果与 ppscore 进行比较
- python - TensorFlow tensor_scatter_nd_add 索引
- java - Card Layout 可以显示 Card Layout
- postgresql - 将来自 JSON 数组对象字段的数据与另一个表连接起来
- linux - 当某些条件为真时,使用“sed”对两个连续的行重新排序
- python - 从 Django 模型获取 chart.js 的动态数据
- python - 使用带有默认条件的 sklearn2pmml 将决策树转换为 PMML