【问题标题】:MySQL Error: Incorrect usage of UPDATE and LIMITMySQL 错误:错误使用 UPDATE 和 LIMIT
【发布时间】:2011-05-16 13:32:36
【问题描述】:

如何纠正这个问题,以便我的 MySQL 代码正常工作。

这是我的 MySQL 代码,它给我带来了问题。

$q = "UPDATE users INNER JOIN contact_info ON contact_info.user_id = users.user_id SET active.users = NULL WHERE (email.contact_info = '" . mysqli_real_escape_string($mysqli, $x) . "' AND active.users = '" . mysqli_real_escape_string($mysqli, $y) . "') LIMIT 1";
$r = mysqli_query ($mysqli, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($mysqli));

【问题讨论】:

  • 您的查询包括对“活动”和“电子邮件”表中列的引用,而这些表不包含在语句中。查看“dev.mysql.com/doc/refman/5.1/en/update.html”以获取有关如何构建多表更新的指导。

标签: mysql sql-update


【解决方案1】:

根据UPDATE 的 MySQL 文档:

对于多表语法,UPDATE 更新 table_references 中命名的每个表中满足条件的行。在这种情况下,不能使用 ORDER BY 和 LIMIT。

【讨论】:

  • 我想文档实际上的意思是说“既不能使用 ORDER BY 也不能使用 LIMIT”,因为我尝试 LIMIT 而不使用 ORDER BY 并且仍然遇到此错误。
【解决方案2】:

**如果你想在 mysql 中使用限制更新多行...直接限制你不能使用这样尝试**

UPDATE table_name SET name='test'
     WHERE id IN (
         SELECT id FROM (
             SELECT id FROM table_name 
             ORDER BY id ASC  
             LIMIT 0, 10
         ) tmp
     );

【讨论】:

  • IN() 中的子选择像 **** 一样慢,并且可以永远锁定表。请改用EXISTS()
  • 语法错误或访问冲突:1235 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL /ANY/SOME subquery'
【解决方案3】:

对于多表语法,UPDATE 更新每个表中的行 满足条件的 table_references。在这种情况下,ORDER BYLIMIT 无法使用

【讨论】:

    【解决方案4】:

    我知道这是一个老问题,但它是谷歌搜索此错误时的第一个链接。 有一种解决方法可以通过使用派生表来解决此问题而不会出现性能问题(取决于您的索引)。

    UPDATE table1 t1
    JOIN (SELECT t1.id
        FROM table1 t1
        JOIN table2 t2 ON t1.id = t2.id
            AND t2.some_criteria = 'some_value'
        WHERE t1.other_criteria = 'other_value'
        LIMIT 10000
    ) tmp ON tmp.id = t1.id
    SET t1.field_to_update = 'new_value'
    

    因为 LIMIT 在子查询内部,所以连接只会匹配子句 LIMIT 的行数。所以查询只会更新那些行。

    【讨论】:

      【解决方案5】:

      @Marc B 提供了update 通常不能与limit 一起使用的原因。

      而且@Roopchand 也提供了解决方案。

      对于像我这样试图避免关闭safe update mode的人

      https://stackoverflow.com/a/28316067/1278112
      这个答案很有帮助。举个例子

      更新客户 SET countryCode = 'USA' WHERE国家='美国'; -- 这给出了错误,你只需写:

      更新客户 SET countryCode = 'USA' WHERE (country = 'USA' AND customerNumber 0); -- 因为 customerNumber 是主键,所以不再出现错误 1175。

      当我使用多表语法面对update 时,它也起作用了。

      我想要但会引发错误代码 1175。

      UPDATE table1 t1
              INNER JOIN
          table2 t2 ON t1.name = t2.name 
      SET 
          t1.column = t2.column
      WHERE
          t1.name = t2.name;
      

      工作版

      UPDATE table1 t1
              INNER JOIN
          table2 t2 ON t1.name = t2.name 
      SET 
          t1.column = t2.column
      WHERE
          (t1.name = t2.name and t1.prime_key !=0);
      

      这真的很简单和优雅。由于原始答案没有得到太多关注(投票),因此我发布了更多解释。希望这可以帮助其他人。

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 2012-02-21
        • 1970-01-01
        • 2017-01-15
        相关资源
        最近更新 更多