SQL UPDATE与LIKE

时间:2012-08-29 11:25:10

标签: mysql database

我试图通过使用像这样的语句来更新表中大约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更新记录?

7 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

这是因为您的列名log_name不应该在'引号中。

"log_name" LIKE "%PC01%"条件将始终失败,零行将更新,请尝试以下操作:

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

答案 2 :(得分: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(或其超集)。双引号则专门用于标识符,单引号用于字符串。
  4. #3是我个人的最爱,可读性和便携性。问题是它往往会让只知道MySQL的人大吃一惊,你必须记住覆盖默认值。

答案 3 :(得分:0)

"log_name" should not be in quotes

答案 4 :(得分:0)

正在寻找同样但对我不起作用.... 但这很完美:

$title = "Worklog details";
$log_name = 'PC01';
$update = $connection -> prepare("UPDATE nc_files 
SET title = ? 
WHERE log_name = ?");
$update->bind_param('ss',$title,$log_name);
$update->execute();
$update->close();

答案 5 :(得分:0)

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

更新表SET Table.Field =“myreplace” WHERE(((Table.Field)赞'%A-16%'));

此致,Alexwin1982

答案 6 :(得分:0)

尝试替换关键字 UPDATE nc_files SET title = REPLACE(title,'PC01','Worklog详细信息')WHERE log_name喜欢'%PC01%'