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. 常に変更をオーバーライドしてANSI_QUOTES (またはそのスーパーセット)sql_modeを含めます。二重引用符は識別子専用で、単一引用符は文字列専用です。

#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 に答える