Ошибка MySQL: неправильное использование UPDATE и LIMIT - PullRequest
23 голосов
/ 27 ноября 2010

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

Ответы [ 4 ]

46 голосов
/ 27 ноября 2010

Согласно документации MySQL для ОБНОВЛЕНИЕ :

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

17 голосов
/ 27 сентября 2012

**, если вы хотите обновить несколько строк, используя ограничение в 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 голосов
/ 31 августа 2015

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

0 голосов
/ 17 апреля 2019

@ Марк Б приводит причину, по которой update обычно не может работать с limit.

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

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

https://stackoverflow.com/a/28316067/1278112
Этот ответ весьма полезен.Здесь приведен пример

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...