MySQL - запрос UPDATE с LIMIT
Я хочу обновить строки в моей таблице, начиная с 1001 до 1000.
Я попробовал следующий запрос:
UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
- Это дает мне синтаксическую ошибку. Это верно? я делаю какую-либо ошибку здесь.
- Можем ли мы ограничить обновление таким образом?
Кроме того, строки, которые я пытаюсь обновить, имеют значение Null для столбца p_id, имеющего тип данных INTEGER. Из-за этого я даже не могу обновить, используя следующий запрос:
UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
- Правильно ли указан мой предыдущий запрос?
- Что можно сделать для достижения этого?
Ответы
Ответ 1
При работе с нулем =
не соответствует нулевым значениям. Вы можете использовать IS NULL
или IS NOT NULL
UPDATE 'smartmeter_usage'.'users_reporting'
SET panel_id = 3 WHERE panel_id IS NULL
LIMIT
можно использовать с UPDATE
но только с row count
Ответ 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
Я бы предложил двухэтапный запрос
Я предполагаю, что у вас есть автоинкрементный первичный ключ, потому что вы говорите, что ваш ПК (max + 1), который звучит как определение ключа автоопределения.
Я вызываю PK id
, заменяю все, на что вы звоните.
1 - укажите номер первичного ключа для столбца 1000.
SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000
2 - обновите таблицу.
UPDATE smartmeter_usage.users_reporting SET panel_id = 3
WHERE panel_id IS NULL AND id >= @id
ORDER BY id
LIMIT 1000
Пожалуйста, проверьте, не сделал ли я ошибку по отдельности; вам может потребоваться добавить или вычесть 1 где-нибудь.
Ответ 4
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000
Этот запрос неверен (или, по крайней мере, я не знаю, как использовать ограничение в запросах UPDATE), вы должны поставить условие where
на первичный ключ (это предполагает, что у вас есть столбец auto_increment как ваш первичный ключ, если не предоставить более подробную информацию):
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000
Для второго запроса вы должны использовать IS
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null
EDIT - если ваш primary_key - это столбец с именем MAX + 1, вы должны запросить (с обратными шагами, как указано в комментарии):
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000
Чтобы обновить строки с MAX + 1 от 1001 до 2000 (включая 1001 и 2000)
Ответ 5
Вы должны использовать IS, а не = для сравнения с NULL.
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null
Предложение LIMIT
в MySQL при применении к обновлению не позволяет указать смещение.
Ответ 6
Вы можете сделать это с LIMIT, но не с LIMIT и OFFSET.
Ответ 7
Вам следует рассмотреть возможность использования ORDER BY
, если вы намереваетесь ограничить свой UPDATE, потому что в противном случае он будет обновляться при упорядочении таблицы, что может быть неверным.
Но, как говорит А, он допускает ограничение только на row_count, а не на смещение.
Ответ 8
Для людей получить этот пост с помощью поиска "предел обновления MySQL", пытаясь избежать отключения safe update mode
при update
с синтаксисом нескольких таблиц.
Так как официальный документ государства
Для синтаксиса с несколькими таблицами UPDATE обновляет строки в каждой таблице, названной в table_references, которые удовлетворяют условиям. В этом случае нельзя использовать ORDER BY и LIMIT.
fooobar.com/questions/16826/...
Я думаю, что этот ответ весьма полезен. Это дает пример
ОБНОВЛЕНИЕ клиентов УСТАНОВИТЬ countryCode = 'США' ГДЕ страна = 'США'; - который дает ошибку, вы просто пишете:
ОБНОВЛЕНИЕ клиентов УСТАНОВИТЬ countryCode = 'США' ГДЕ (страна = 'США' И customerNumber <> 0); - Поскольку customerNumber является первичным ключом, у вас больше нет ошибки 1175.
Что я хочу, но поднимет код ошибки 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);
Что действительно просто и элегантно. Поскольку оригинальный ответ не привлекает слишком много внимания (голосов), я публикую больше объяснений. Надеюсь, что это может помочь другим.
Ответ 9
В дополнение к вложенному подходу, описанному выше, вы можете выполнить LIMIT
используя JOIN
для той же таблицы:
UPDATE 'table_name'
INNER JOIN (SELECT 'id' from 'table_name' order by 'id' limit 0,100) as t2 using ('id')
SET 'name' = 'test'
По моему опыту, оптимизатор запросов mysql более доволен этой структурой.