MySQL 错误:错误使用 UPDATE 和 LIMIT

Posted

技术标签:

【中文标题】MySQL 错误:错误使用 UPDATE 和 LIMIT【英文标题】:MySQL Error: Incorrect usage of UPDATE and 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”以获取有关如何构建多表更新的指导。 【参考方案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://***.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);

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

【讨论】:

以上是关于MySQL 错误:错误使用 UPDATE 和 LIMIT的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UPDATE 期间解决错误代码 1175 mySQL?

mysql update报错

mysql update语句运行无错误但是没有更新

错误mysql 出现 "1067 - Invalid default value for 'UPDATE_TIME' " 错误提示的解决办法

MySQL:存储过程语法错误

Mysql中You can’t specify target table for update in FROM clause错误解决方法