MySQL错误:更新和限制的使用不正确

MySQL错误:更新和限制的使用不正确,mysql,sql-update,Mysql,Sql Update,如何纠正这个问题,使我的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 = '"

如何纠正这个问题,使我的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));
$q=“在联系人上更新用户内部加入联系人信息。用户id=users.user\u id设置为active.users=NULL,其中(email.contact\u info=”。mysqli\u real\u escape\u string($mysqli,$x)。“”和active.users=”。mysqli\u real\u escape\u string($mysqli,$y)。“)限制1”;
$r=mysqli_query($mysqli,$q)或trigger_error(“query:$q\n
MySQL error:“.mysqli_error($mysqli));
根据MySQL文档:


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

**如果您想在mysql中使用limit更新多行,请直接使用limit,这样做是不行的**


对于多表语法,
UPDATE
更新中命名的每个表中的行 表_满足条件的参考。在这种情况下,
ORDER BY
LIMIT

无法使用

@Marc B提供了原因,说明了为什么
更新
通常无法使用
限制

@Roopchand也提供了一个解决方案

对于像我这样试图避免关闭
安全更新模式的人


这个答案很有帮助。它给出了一个例子

更新客户集countryCode='USA' 其中国家=‘美国’;——这会产生错误,您只需写:

更新客户集countryCode='USA' 其中(国家=‘美国’和客户编号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);

这真的很简单和优雅。由于最初的答案没有得到太多的关注(投票),我发布了更多的解释。希望这能帮助别人

我知道这是一个老问题,但这是谷歌搜索此错误时的第一个链接。 通过使用派生表,可以在不存在性能问题(取决于索引)的情况下解决此问题

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'

因为限制在子查询内,所以联接将只匹配子句限制的行数。因此,查询将只更新这些行。

您的查询包括对“活动”和“电子邮件”表中列的引用,而这些表不包括在语句中。查看“”以获取有关如何构造多表更新的指导。在
IN()
中的子选择与****一样慢,并且可以像永远一样锁定表。改为使用
EXISTS()
。语法错误或访问冲突:1235此版本的MySQL尚不支持“LIMIT&IN/ALL/ANY/SOME子查询”。我想文档实际上是说“ORDER BY和LIMIT都不能使用”,因为我在不使用ORDER BY的情况下尝试进行限制,但仍然遇到此错误。这对我来说非常有用,非常感谢。
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'