2016-12-12 13 views
0

Я просмотрел все связанные вопросы, которые я нашел, но не смог получить тот, который ответит мне.Mysql Обновление одного столбца из нескольких строк в одном запросе

я получил таблицу, как это:

id | name | age | active | ...... | ... | 

где «идентификатор» является первичным ключом, а ... значит есть что-то вроде 30 столбцов. «активный» столбец имеет тип tinyint.

Моя задача:

Update идентификаторы 1,4,12,55,111 (те, которые просто пример, это может быть 1000 различных идентификатор в целом) с активным = 1 в одном запросе.

я сделал:

UPDATE table SET active = 1 WHERE id IN (1,4,12,55,111) 
  • его внутри транзакции, потому что я что-то еще в этом процессе обновления.

  • двигатель InnoDB


Моей проблема:

Кто-то сказало мне, что делать такой запрос эквивалентно 5 запросов на выполнении, вызывает IN переведет к а заданное число OR, и запускать их один за другим.

В конечном итоге вместо 1 я получаю N, который является номером в IN.

Он предлагает создать временную таблицу, вставить в нее все новые значения и затем обновить путем объединения.

Он прав? как эквивалентности, так и производительности.


Что вы предлагаете? я думал, что INSERT INTO .. ​​ON DUPLICATE UPDATE поможет, но у меня нет всех данных для строки, только его id и что я хочу установить на нем active = 1.

Возможно, этот вопрос лучше?

UPDATE table SET 
active = CASE 
WHEN id='1' THEN '1' 
WHEN id='4' THEN '1' 
WHEN id='12' THEN '1' 
WHEN id='55' THEN '1' 
WHEN id='111' THEN '1' 
ELSE active END 
WHERE campaign_id > 0; //otherwise it throws an error about updating without where clause in safe mode, and i don't know if i could toggle safe mode off. 

Спасибо.

+0

Да, он прав или существует. Обновить таблицу set active = 1, где Exists (выбрать 1 из таблицы2, где ...) –

ответ

0

Я думаю, что ниже лучше, потому что он использует первичный ключ.

UPDATE table SET active = 1 WHERE id<=5 
+0

1-5 - всего лишь пример, id может быть любым набором чисел, например: (1,10,23,44,51), я отредактирую вопрос, чтобы он был более ясным – user2212726

1

Это наоборот. OR иногда можно превратить в IN. IN затем эффективно выполняется, особенно если в столбце есть индекс. Если у вас есть 1000 записей в IN, он будет делать 1000 зондов в таблице на основе id.

Если вы используете достаточно новую версию MySQL, я думаю, вы можете сделать EXPLAIN EXTENDED UPDATE ...OR...; SHOW WARNINGS;, чтобы увидеть это преобразование;

UPDATE CASE..., вероятно, утомительно проверит каждую строку.

Возможно, было бы лучше для других пользователей системы, если вы сломали UPDATE на несколько UPDATEs, каждый из которых имеет 100-1000 строк. More on chunking.

Откуда вы получили идентификаторы в первую очередь? Если бы это было через SELECT, то, возможно, было бы целесообразно объединить его с UPDATE, чтобы сделать его на один шаг вместо двух.

 Смежные вопросы

  • Нет связанных вопросов^_^