8

我试图通过使用类似这样的语句来更新表中的大约 20,000 条记录,但是,我收到消息说它0 row(s) affected不起作用。

UPDATE nc_files SET title ="Worklog details" WHERE "log_name" LIKE "%PC01%"

log_name字段具有混合文件扩展名和大小写的所有文件名,例如

PC01.TXT | Worklog details

PC02.txt | Project Summary

PC03.DOC| Worklog details

PC04.doc| Project Summary

我需要使用的原因LIKE是更新的文件只有文件名没有扩展名,例如

PC01 | Worklog details

PC02 | Project Summary

如何使用 更新记录LIKE

4

6 回答 6

14

log_name是一个字段名称,从中删除文字引号 -

UPDATE nc_files SET title ="Worklog details" WHERE log_name LIKE "%PC01%"
于 2012-08-29T11:30:25.357 回答
3

这是因为您的列名log_name不应该用'引号引起来。

"log_name" LIKE "%PC01%"条件总是会失败并且零行会被更新,试试这个:

UPDATE nc_files 
SET title ="Worklog details" 
WHERE log_name LIKE "%PC01%";
于 2012-08-29T11:30:11.300 回答
1

默认情况下,MySQL 允许将双引号名称理解为标识符(如列名)或字符串文字。

这是为了方便,但我发现语义上的歧义令人沮丧。MySQL 必须解决歧义,并且不能像您发现的那样总是神奇地猜测编码器的意图。

-- In default sql_mode under 5.5
--
SELECT "foo"           -- "foo" is a *column* if tbl.foo exists, otherwise a string 
  FROM "tbl"           -- Oops!  ER_PARSE_ERROR (1064)  Can't do this in default mode.
 WHERE "foo" = "foo";  -- Both of these are strings

因此,解决它的方法是强制对标识符进行明确的解释:

  1. 不要引用简单的标识符
  2. 使用 MySQL 特定的反引号进行引用
    (这是 ODBC 的 SQL_IDENTIFIER_QUOTE_CHAR)
  3. 始终覆盖更改sql_mode以包含ANSI_QUOTES(或其超集)
    然后双引号专门用于标识符,单引号用于字符串。

#3 是我个人最喜欢的,因为它具有可读性和可移植性。问题是它往往会让只知道 MySQL 的人感到惊讶,并且您必须记住覆盖默认值。

于 2012-08-29T14:05:13.640 回答
0
"log_name" should not be in quotes
于 2012-08-29T11:30:48.527 回答
0

我遇到了类似的麻烦。问题是引号“我修正了我的代码如下。

UPDATE Table SET Table.Field = "myreplace" WHERE (((Table.Field) Like '%A-16%'));

问候, Alexwin1982

于 2016-11-09T16:24:57.980 回答
0

尝试替换关键字 UPDATE nc_filesSET title= REPLACE( title, 'PC01', 'Worklog details') WHERE log_name LIKE '%PC01%'

于 2019-01-10T07:01:00.317 回答