2012-10-05 14 views
52

CLIスクリプトを使用して大規模なMyISAMテーブル(2,500万レコード)を更新しようとしています。テーブルが他のものによってロックされたり使用されたりしていません。MySQLアップデートCASE WHEN/THEN/ELSE

私は、レコードごとに単一のUPDATEクエリを実行する代わりに、CASE機能を利用することもできます。

idフィールドはPRIMARYです。私は次のクエリがミリ秒かかると思う。

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

このように、クエリはCPUを必要とし、永遠に終了しません。

次に、私の驚いたことに、クエリでは、指定しなかった行にNULLを配置して2500万行すべてを更新していることがわかりました。

目的は何ですか?このクエリを実行するたびに、2,500万の行を更新せずに、特定の行に対してMASS更新を行うことはできますか?あるいは私は個人的な更新をしてからコミットする必要がありますか?

+2

'case'文に' else'を指定してください。デフォルトは 'null'です –

答えて

105

この

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

は完全にWHERE ..を忘れました。おかげで笑。 – nick

5

シンプル試しは次のようになります。あなたはELSE逃したためだ

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

"最初の条件の結果を返します。一致する結果値がなかった場合は、ELSEの後の結果が返されます。ELSEの部分がない場合はNULLが返されます。シンプル (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case

+0

ELSEを指定しても、残りの部分を更新しようとしませんか?私はまだ更新する必要があるときに2500万レコードを更新する必要はありません。3. WHERE句を配置すると問題が解決します。 – nick

+0

idが正確に1、2、3でないときに、ELSE BEGIN END – alex