2012-10-05 13 views
52

Próbuję zaktualizować tabelę MYISAM LARGE (25 milionów rekordów) przy użyciu skryptu CLI. Tabela nie jest zablokowana/używana przez cokolwiek innego.Aktualizacja aktualizacji MySQL WHEN/THEN/ELSE

Uznałem, że zamiast pojedynczych zapytań UPDATE dla każdego rekordu, równie dobrze mogę wykorzystać funkcję CASE.

Pole id jest PODSTAWOWE. Podejrzewam, że następujące zapytanie powinno zająć milisekundy.

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

Lo i oto, zapytanie wieńczy procesor i nie kończy się na zawsze.

Następnie, ku mojemu zaskoczeniu, dowiedziałem się, że zapytanie aktualizuje wszystkie 25 milionów wierszy, umieszczając NULL na wierszach, których nie określiłem.

Jaki jest tego cel? Czy mogę po prostu wykonać aktualizację MASS dla określonych wierszy bez aktualizowania 25 milionów wierszy za każdym razem, gdy wykonuję to zapytanie? Czy muszę wykonać indywidualne aktualizacje, a następnie zatwierdzić?

+2

kiedy nie określ "else" w instrukcji 'case' domyślnie jest' null' –

Odpowiedz

105

Spróbuj

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) 
+1

całkowicie zapomniał o WHERE ... teraz ma sens, dlaczego tak się dzieje. Dzięki lol. – nick

5

Prościej byłoby:

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

To dlatego, że brakowało jeszcze.

"Zwraca wynik dla pierwszego warunku, który jest prawdziwy, jeśli nie było pasującej wartości wyniku, zwracany jest wynik po ELSE lub NULL, jeśli nie ma części ELSE." (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

+0

nawet jeśli podałem ELSE. Czy nie próbowałoby zaktualizować reszty? Nadal nie chcę aktualizować 25 milionów rekordów, gdy potrzebuję tylko aktualizacji 3. Umieszczenie klauzuli WHERE rozwiązuje problem. – nick

+0

Możesz spróbować ELSE BEGIN END – alex