2012-08-29 213 views
2

我试图通过使用像这样的语句更新表中约20,000条记录,但是,我收到消息说0 row(s) affected,所以它没有工作。SQL UPDATE WITH LIKE

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

log_name领域拥有所有混合文件扩展名和情况,e.g文件名。

PC01.TXT | Worklog details 

PC02.txt | Project Summary 

PC03.DOC| Worklog details 

PC04.doc| Project Summary 

我之所以需要使用LIKE的是,更新后的文件只有文件名不带扩展名,例如

PC01 | Worklog details 

PC02 | Project Summary 

如何使用LIKE更新记录?

+1

您是否尝试选择行? SELECT * FROM nc_files WHERE log_name LIKE“%PC01%” – hgulyan

+0

首先,尝试使用相同的WHERE子句执行select语句,这将证明where子句是否匹配目标表上的任何行。你确定案件是否匹配?是以小写形式保存的数据,而where子句使用的是大写? – Hector

+0

您的问题已回答。作为一个额外的建议,如果你更新的文件包含没有扩展名的文件名,我建议改变你的LIKE子句,如下所示:WHERE log_name LIKE“PC01%”'。这将确保使用索引(如果有的话),使查询更快。 – Diego

回答

4

log_name是一个字段名,从中取出字面报价 -

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

这是因为您的专栏名称log_name不应在'的引号中。

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

UPDATE nc_files 
SET title ="Worklog details" 
WHERE log_name LIKE "%PC01%"; 
0
"log_name" should not be in quotes 
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特定
  3. 使用反引号的报价
    (这是ODBC的SQL_IDENTIFIER_QUOTE_CHAR)
  4. 总是覆盖更改sql_mode以包含ANSI_QUOTES(或其超集)
    双引号然后专用于标识符,单引号用于stri NGS。

#3是我个人的最爱,为了可读性和便携性。问题是它往往会让只知道MySQL的人感到惊讶,并且你必须记住重写默认值。

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(); 
0

我也有过类似的麻烦。问题是引号“ I固定我的代码如下。

UPDATE Table SET Table.Field =”myreplace“ WHERE(((表。字段)像'%A-16%'));

此致,Alexwin1982