2012-08-29 169 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