Ошибка 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);
Что действительно просто и элегантно. Поскольку оригинальный ответ не привлекает слишком много внимания (голосов), я публикую больше объяснений. Надеюсь, что это может помочь другим.