MySQL错误:UPDATE和LIMIT的使用不正确

时间:2010-11-27 13:20:07

标签: 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 = '" . 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));

5 个答案:

答案 0 :(得分:46)

根据UPDATE的MySQL文档:

  

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

答案 1 :(得分:16)

**如果您想使用mysql中的限制更新多行...直接限制您无法使用尝试这样* * < / EM>

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
     );

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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子句的行数。因此查询将仅更新那些行。

答案 4 :(得分:0)

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

@Roopchand也提供了解决方案。

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

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

  

更新客户SET countryCode ='美国'       WHERE country ='USA'; -出现错误,您只需编写:

     

更新客户SET countryCode ='美国'       在哪里(国家/地区=“美国”且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);

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