MySQL-запрос обновления с ограничением

Я хочу обновить строки в моей таблице, начиная со 1001 до следующей 1000.

Я попытался со следующим запросом:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
  1. это дает мне синтаксическая ошибка. Правильно ли это? я делаю какую-то ошибку.
  2. можем ли мы ограничить обновление таким образом?

кроме того, строки, которые я пытаюсь обновить, имеют нулевое значение для столбца p_id, который имеет тип данных INTEGER. Из-за этого я даже не могу обновить, используя следующее запрос:

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
  1. правильно мой предыдущий запрос?
  2. что можно сделать для этого?

7 ответов


при работе с null = не соответствует нулевым значениям, которые вы можете использовать IS NULL или IS NOT NULL

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 WHERE panel_id IS NULL

LIMIT может использоваться с UPDATE но с row count только


Если вы хотите обновить несколько строк, используя limit в 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
)

Я бы предложил двухэтапный запрос

Я предполагаю, что у вас есть автоинкрементный первичный ключ, потому что вы говорите, что ваш ПК (max+1), который звучит как определение ключа autioincrementing.
Я вызываю ПК 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

пожалуйста, проверьте, не сделал ли я ошибку off-by-one; возможно, вам придется где-то добавить или вычесть 1.


UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000

этот запрос неверен (или, по крайней мере, я не знаю, как использовать limit в запросах обновления), вы должны поставить where условие на вас первичный ключ (это предполагает, что у вас есть столбец auto_increment в качестве первичного ключа, если не предоставить более подробную информацию):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000

для второго запроса, вы должны использовать

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)


вы должны использовать IS, а не = для сравнения с NULL.

UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null

на LIMIT предложение в MySQL при применении к обновлению не позволяет указывать смещение.


вы должны очень рассмотреть возможность использования ORDER BY Если вы намерены ограничить обновление, потому что в противном случае он будет обновляться в порядке таблицы, что может быть неправильным.

но, как будет сказано, он позволяет ограничивать только row_count, а не смещать.


вы можете сделать это с лимитом, просто не с лимитом и смещением.