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

Я пытаюсь обновить таблицу LARGE MyISAM (25 миллионов записей), используя скрипт CLI. Таблица не блокируется / не используется ничем другим.

Я решил вместо того, чтобы делать одиночные запросы UPDATE для каждой записи, я мог бы также использовать функцию CASE.

Поле id является ОСНОВНЫМ. Я подозреваю, что следующий запрос должен занимать миллисекунды.

 UPDATE `table` SET `uid` = CASE WHEN id = 1 THEN 2952 WHEN id = 2 THEN 4925 WHEN id = 3 THEN 1592 END 

Ло, и вот, запрос свивает 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 )

  • phpMyAdmin - не удается подключиться - недействительные настройки - с тех пор, как я добавил пароль с правами root
  • Выберите определенную строку из таблицы mysql
  • MySQL отключить и включить ключи
  • Как решить MySQL max_user_connections
  • Включить Entity Framework 6 для MySql (C #) в WinForms Microsoft Visual Studio 2013
  • mysql select int как валюта или конвертировать int в формат валюты?
  • Ошибка миграции Laravel: ошибка синтаксиса или нарушение доступа: 1071 Указанный ключ был слишком длинным; максимальная длина ключа - 767 байт
  • Как получить максимум двух значений в MySQL?
  • INSERT INTO ... SELECT для всех столбцов MySQL
  • Невозможно создать модель данных сущности - с помощью MySql и EF6
  • Разница MySQL между двумя строками оператора SELECT
  • Давайте будем гением компьютера.