【问题标题】:SQL UPDATE with LIKE使用 LIKE 进行 SQL 更新
【发布时间】:2012-08-23 23:56:50
【问题描述】:

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

【问题讨论】:

  • 您是否尝试选择行? SELECT * FROM nc_files WHERE log_name LIKE "%PC01%"
  • 首先,尝试使用相同的 WHERE 子句执行 select 语句,这将证明您的 where 子句是否匹配目标表上的任何行。你确定大小写匹配吗?例如数据是小写的,你的 where 子句使用大写吗?
  • 您的问题已得到解答。作为附加建议,如果您更新的文件包含没有扩展名的文件名,我建议您将 LIKE 子句更改如下:WHERE log_name LIKE "PC01%"。这将确保使用索引(如果存在),从而加快查询速度。

标签: mysql database


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      默认情况下,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 的人感到惊讶,并且您必须记住覆盖默认值。

      【讨论】:

        【解决方案4】:
        "log_name" should not be in quotes
        

        【讨论】:

          【解决方案5】:

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

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

          问候,Alexwin1982

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 2023-04-11
              • 2011-03-13
              • 1970-01-01
              • 1970-01-01
              • 2013-12-26
              • 1970-01-01
              • 1970-01-01
              • 2023-04-04
              相关资源
              最近更新 更多