2012-10-05 20 views
52

Bir CLI komut dosyası kullanarak bir LARGE MyISAM tablosunu (25 milyon kayıt) güncelleştirmeye çalışıyorum. Tablo kilitli/başka bir şey tarafından kullanılmıyor.MySQL güncelleştirmesi CASE WHEN/THEN/ELSE

Her kayıt için tek UPDATE sorgusu yapmak yerine, CASE özelliğini kullanabileceğimi düşündüm.

id alanı PRIMARY'tır. Aşağıdaki sorgunun milisaniye alması gerektiğinden şüpheleniyorum.

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

Sorgu, CPU'yu bekletir ve sonsuza dek bitmez.

Daha sonra, sürprizime göre, sorgunun belirttiğim satırlara bir NULL yerleştirerek, 25 milyon satırın tümünü güncelleştirdiğini öğrendim.

Bunun amacı nedir? Bu sorguyu her çalıştırdığımda 25 milyon satırı güncellemeden belirli satırlarda MASS güncellemesi yapabilir miyim? Yoksa bireysel güncellemeler yapmalı mıyım?

+2

'case' içinde' else' ifadesini belirtin 'null' sıfırdır –

cevap

105

olurdu bu

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

tamamen WHERE hakkında unuttu .. şimdi bunun neden olduğunu anlamlandırıyor. Teşekkürler. Bir ELSE belirtsem bile – nick

5

basit deneyin:

Eğer BAŞKA cevapsız çünkü var
UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3) 
4

.

"İlk koşulun sonucunu döndürür. Eşleşen bir sonuç değeri yoksa, ELSE sonra sonuç döndürülür veya ELSE parçası yoksa NULL". Daha basit (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

+0

.. Diğerlerini güncellemeyi denememeli miydi? Sadece güncellemek istediğimde 25 milyon kayıt güncellemek istemiyorum. 3. WHERE yan tümcesini yerleştirmek sorunu çözüyor. – nick

+0

Eğer tam olarak 1, 2, 3 ... sahip olmadığınız zaman yanıltıcı olarak ELSE BEGIN END – alex