Ответ 1
Попробуйте это
UPDATE `table` SET `uid` = CASE
WHEN id = 1 THEN 2952
WHEN id = 2 THEN 4925
WHEN id = 3 THEN 1592
ELSE `uid`
END
WHERE id in (1,2,3)
Я пытаюсь обновить таблицу LARGE MyISAM (25 миллионов записей) с помощью CLI script. Таблица не блокируется/не используется ничем другим.
Я решил вместо того, чтобы делать одиночные запросы UPDATE для каждой записи, я мог бы также использовать функцию CASE.
Поле id
является ПЕРВИЧНЫМ. Я подозреваю, что следующий запрос должен занимать миллисекунды.
UPDATE `table` SET `uid` = CASE
WHEN id = 1 THEN 2952
WHEN id = 2 THEN 4925
WHEN id = 3 THEN 1592
END
Lo и вот, запрос обрабатывает CPU и не заканчивается навсегда.
Затем, к моему удивлению, я узнал, что запрос обновляет все 25 миллионов строк, помещая NULL в строки, которые я не указывал.
Какова цель этого? Могу ли я просто обновить MASS для определенных строк без обновления 25 миллионов строк при каждом выполнении этого запроса? Или мне нужно делать отдельные обновления, а затем совершать?
Попробуйте это
UPDATE `table` SET `uid` = CASE
WHEN id = 1 THEN 2952
WHEN id = 2 THEN 4925
WHEN id = 3 THEN 1592
ELSE `uid`
END
WHERE id in (1,2,3)
Упрощение будет:
UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)
Это будет работать, только если uid действительно 1, 2, 3.
Источник: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_elt
Упрощение будет:
UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)
Это потому, что вы пропустили ELSE.
"Возвращает результат для первого условия, которое является истинным. Если не было совпадающего результата результата, возвращается результат после ELSE или NULL, если нет ELSE-части". (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)