Ошибка MySQL: неправильное использование UPDATE и LIMIT

Как я могу исправить эту проблему, чтобы мой код 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));

Ответы

Ответ 1

В соответствии с документами MySQL для UPDATE:

Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице с именем table_references, которые удовлетворяют условиям. В этом случае ORDER BY и LIMIT не могут использоваться.

Ответ 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
     );

Ответ 3

Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице, указанной в table_references, которые удовлетворяют условиям. В этом случае ORDER BY и LIMIT не может использоваться

Ответ 4

@Marc B предоставляет причину, почему update обычно не может работать с limit.

И @Roopchand также предоставляют решение.

Для таких, как я, кто пытается избежать отключения safe update mode

fooobar.com/info/16826/...
Этот ответ весьма полезен. Приведи пример

ОБНОВЛЕНИЕ клиентов УСТАНОВИТЬ countryCode = 'США' ГДЕ страна = 'США'; - который дает ошибку, вы просто пишете:

ОБНОВЛЕНИЕ клиентов УСТАНОВИТЬ 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);

Что действительно просто и элегантно. Поскольку оригинальный ответ не привлекает слишком много внимания (голосов), я публикую больше объяснений. Надеюсь, что это может помочь другим.