mySQL UPDATE查询返回“0行受影响”

时间:2010-02-02 19:15:05

标签: mysql sql-update

我有这个问题:

UPDATE phonecalls 
   SET Called = "Yes" 
 WHERE PhoneNumber = "999 29-4655"

我的表格为phonecalls,我有一个名为PhoneNumber的列。我想要更新的是一个名为Called到“是”的列。

知道我做错了什么吗?当我返回我的查询时,它说0行受影响。

11 个答案:

答案 0 :(得分:32)

如安非他明和Yada建议的那样,如果您的电话号码在表格中,请使用SELECT进行检查。

但请记住:如果相关行的called值已经为“是”,则mysql不会更改该值,因此将返回“0行受影响”。因此,请务必检查called

的当前值

答案 1 :(得分:7)

我观察到0个受影响的行的另一个原因:错误的数据类型。如果要更新的列是整数或布尔值,并将其设置为字符串,则不会更新 - 但您也不会收到错误。

总结这篇文章中的其他策略/想法:

  1. 使用SELECT语句检查您的WHERE是否有效并返回结果。
  2. 检查列是否已包含您要设置的值。
  3. 检查所需的值是否适合列的数据类型。

答案 2 :(得分:1)

问题可能是没有PhoneNumber == "999 29-4655"的记录。

尝试此查询:

SELECT * FROM phonecalls where PhoneNumber = '999 29-4655'

如果它没有返回任何内容,则没有匹配的行。

答案 3 :(得分:1)

为了Google的任何人的利益,此问题是由我造成的,因为我试图使用CONCAT()附加到空白字段。

UPDATE example SET data=CONCAT(data, 'more');

如果dataNULL,则CONCAT()会返回NULL(忽略第二个参数),因此值不会更改(更新NULL值为NULL值,因此更新了0行。

在这种情况下,更改为CONCAT_WS()功能而不是修复问题。

答案 4 :(得分:1)

如果值相同,MySQL将不会更新该行(不会触发任何警告或错误),因此受影响的行数将为0.

答案 5 :(得分:0)

尝试select count(*) from phonecalls where PhoneNumber = "999 29-4655";这将为您提供匹配行数。如果结果为0,则数据库中没有匹配的行.-

答案 6 :(得分:0)

检查以确保返回一些结果。

SELECT * FROM phonecalls WHERE PhoneNumber = '999 29-4655'

如果它没有返回任何结果,则过滤器WHERE PhoneNumber = '999 29-4655'不正确。

答案 7 :(得分:0)

  1. 是否说匹配的行数:1已更改:0警告:0?然后它可能已经设置为该值。
  2. 您是否尝试单引号与双引号?
  3. “999 29-4655”是空格或制表符的空格,在查询和数据库中是否一致?

答案 8 :(得分:0)

这是我的消化:

UPDATE `phonecalls` SET `Called` = 'yeah!' WHERE `PhoneNumber` = '999 29-4655' AND `Called` != 'yeah!'

并确保使用区分大小写的表和字段名称。

答案 9 :(得分:0)

只是遇到了一个晦涩难懂的案例。我们的代码从数据库中读取记录列表,更改一列,然后将它们一一写回。 UPDATE的{​​{1}}子句仅包含两个条件:WHERE。 (时间戳检查是为了进行乐观锁定:如果在写我们的记录之前另一个进程更改了记录,则会更新0行并抛出错误。)

但是对于某一特定行,WHERE key=? AND last_update_dt=?失败了-零行生效。

经过多次拔头发,我注意到该行的时间戳为UPDATE。在美国大部分地区都不存在时间戳记-夏令时会导致时间直接从2:00跳过到3:00。因此,我猜想在从MySQL到Java再到MySQL的往返过程中,代码的某些部分与其他部分对时间戳的解释不同,从而使2019-03-10 02:59子句中的时间戳不匹配。

将行的时间戳更改一小时可以避免此问题。

(当然,正确的修复方法是废除夏令时。我创建了一个Jira,但美国政府尚未对此做出回应。)

答案 10 :(得分:0)

就我而言,我试图更新一列文本以纠正其截断问题。尝试更新为正确的文本会产生0 rows updated,因为该行中的文本没有更改。

一旦我扩展了表格结构中的列以容纳正确的字符数,我就能看到所需的结果。