【问题标题】:UPDATE query not change data in MySQL databaseUPDATE 查询不更改 MySQL 数据库中的数据
【发布时间】:2019-12-08 08:59:20
【问题描述】:

我正在用 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 并正确执行 - 它会更改数据库中的数据。 我在哪里犯了错误?

我发送:“更新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 工作正常

【问题讨论】:

  • 您发送的查询是什么?
  • 尝试将不同的更新语句写入不同的表。看看你是否可以创建一个新表。您可能创建的新表。如果这是一个权限问题(即您只有对该数据库的只读访问权限),这是为了尝试缩小范围。检查它是否只影响一个表/数据库/等

标签: javascript mysql node.js express vue.js


【解决方案1】:

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

 UPDATE ... WHERE t.id = ?

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

UPDATE mytable SET mycol = mycol

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

请注意,为受影响的Rows 返回的值是matchedRows 的值。

matchedRows 具有与 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认为返回的结果不正确,或者认为操作执行不正确。)

【讨论】:

  • 我们只是在猜测。一种可能性是代码(没有提供,所以我们无法判断,我们只是在猜测,这不是调试程序的有效方法)可能正在执行 SQL 语句两次。第一次,它正在改变,第二次,没有改变。也许我们在这里看到的只是第二次执行的结果。再一次,没有看到一些实际的代码,一个我们可以重现的实际测试,我们只是在墙上扔粪,看看有什么能坚持下去。 ericlippert.com/2014/03/05/how-to-debug-small-programs
  • @wachcio:不要发布与 question 相关的代码作为对答案的评论。问题上有一个编辑按钮。据推测,此处作为 cmets 发布的链接是表现出问题中描述的行为的代码。此信息属于问题。不要在 StackOverflow 问题读者可能无法阅读的 cmets 中隐藏这些信息。
【解决方案2】:

问题解决了。我把 v-model 设置错了,要更改的数据和旧的一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多