Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【MySQL】UPDATE文+CASE式で #1062(Duplicate Entry)エラー

UPDATE文でCASE式を使った際に「Duplicate Entry '' for key 'primary'」エラー発生。
エラーの出たSQLは大まかに以下の様な感じ。

    UPDATE 
        table 
    SET 
        field1 = (CASE field2 WHEN value1 THEN value2 END),
        field2 = (CASE field2 WHEN value1 THEN value1 END),
        field3 = (CASE field2 WHEN value1 THEN value3 END)
        ...;

field2tableのプライマリキー。 filed1field3は重複可。

SQL文内にキーに対する同一valueのEntryは無いが、実際にはDuplicate Entryで怒られる。
しかも入力値が''(空文字列)。

以下の様に同条件の単一のUPDATE文にすると正常に実行される。

    UPDATE
        table
    SET
        filed1 = value2,
        field2 = value1,
        field3 = value3
    WHERE
        filed2 = value1;

内部的に空文字列を入力する様な何かが走ってるんだろうと思って、CASE式についてちゃんと調べた。

今までなんとなくの雰囲気で使ってたわ。ごめんなさい。

以下のサイトを参考にさせて頂きました。

公式にちゃんと書いてある。

17.2.10.2. CASEステートメント

検索条件が合致しない場合、ELSE節内のステートメントリストが実行されます。 

で、ELSE節が省略された場合、MySQLはデフォルトでNullを挿入するんですって。
冒頭のUPDATE+CASE式のSQLの場合、field2に対するUPDATEでvalue1に合致しないレコードでfield2にNullが挿入される。
field2tableのプライマリキーなのに、処理が進むとNullでDuplicate Entryされちゃうってこと。多分。

明示的にELSE節を指定するとエラーは出なくなった。

    UPDATE
        table
    SET
        field1 = (CASE field2 WHEN value1 THEN value2 ELSE defalut_value END),
        ...;

めでたし。

教訓

公式マニュアルちゃんと読もう