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 более доволен этой структурой.