MySQL - запрос ОБНОВЛЕНИЯ с LIMIT - PullRequest
54 голосов
/ 09 июня 2011

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

Я попытался выполнить следующий запрос:

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

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

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

Ответы [ 9 ]

102 голосов
/ 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
)
24 голосов
/ 09 июня 2011

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

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

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

8 голосов
/ 09 июня 2011

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

Я предполагаю, что у вас есть первичный ключ с автоинкрементом, потому что вы говорите, что ваш PK (max + 1), что звучит как определение ключа с автоинкрементом.
Я звоню в PK id, замените на то, что называется вашим PK.

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.

3 голосов
/ 09 июня 2011
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

РЕДАКТИРОВАТЬ - если ваш 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)

1 голос
/ 27 июня 2019

В дополнение к вложенному подходу, описанному выше, вы можете выполнить применение 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 более доволен этой структурой.

1 голос
/ 11 мая 2018

Вы можете сделать это с LIMIT, но не с LIMIT и OFFSET.

1 голос
/ 09 июня 2011

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

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

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

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

Для людей, получающих это сообщение с помощью поиска «обновить предел MySQL», стараясь не отключать safe update mode при обращении к update с синтаксисом из нескольких таблиц.

Поскольку официальный документ состояние

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

https://stackoverflow.com/a/28316067/1278112
Я думаю, что этот ответ весьма полезен.Приведен пример

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

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

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

0 голосов
/ 09 июня 2011

Вам следует рассмотреть возможность использования ORDER BY, если вы намерены ОГРАНИЧИТЬ свое ОБНОВЛЕНИЕ, потому что в противном случае оно будет обновляться в порядке упорядочения таблицы, что может быть неверно.

Но, как сказал Уилл А,он допускает только ограничение на row_count, но не смещение.

...