Подтвердить что ты не робот

Обновление MySQL CASE WHEN/THEN/ELSE

Я пытаюсь обновить таблицу 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 миллионов строк при каждом выполнении этого запроса? Или мне нужно делать отдельные обновления, а затем совершать?

4b9b3361

Ответ 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)

Ответ 3

Упрощение будет:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3)

Ответ 4

Это потому, что вы пропустили ELSE.

"Возвращает результат для первого условия, которое является истинным. Если не было совпадающего результата результата, возвращается результат после ELSE или NULL, если нет ELSE-части". (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)