我有这个问题:
UPDATE phonecalls
SET Called = "Yes"
WHERE PhoneNumber = "999 29-4655"
我的表格为phonecalls
,我有一个名为PhoneNumber
的列。我想要更新的是一个名为Called
到“是”的列。
知道我做错了什么吗?当我返回我的查询时,它说0行受影响。
答案 0 :(得分:32)
如安非他明和Yada建议的那样,如果您的电话号码在表格中,请使用SELECT
进行检查。
但请记住:如果相关行的called
值已经为“是”,则mysql不会更改该值,因此将返回“0行受影响”。因此,请务必检查called
答案 1 :(得分:7)
我观察到0个受影响的行的另一个原因:错误的数据类型。如果要更新的列是整数或布尔值,并将其设置为字符串,则不会更新 - 但您也不会收到错误。
总结这篇文章中的其他策略/想法:
SELECT
语句检查您的WHERE是否有效并返回结果。 答案 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');
如果data
为NULL
,则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)
答案 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
,因为该行中的文本没有更改。
一旦我扩展了表格结构中的列以容纳正确的字符数,我就能看到所需的结果。