2011-08-07 37 views
10

我試圖在單個查詢中更新一組記錄(boolean字段)(如果可能的話)。一個查詢中的MySQL更新條件(更新,設置和CASE)

輸入來自分頁的無線電控制,因此給定的POST將具有頁面的值,其值爲truefalse值。

我試圖去這個方向:

UPDATE my_table 
    SET field = CASE 
     WHEN id IN (/* true ids */) THEN TRUE 
     WHEN id IN (/* false ids */) THEN FALSE 
    END 

,但是這導致了「真正的ID」行正在更新true,並ALL其他行進行了更新,以false

我假設我已經犯了一些嚴重的語法錯誤,或者我正在接近這個錯誤。

對解決方案有何想法?

+0

可能重複http://stackoverflow.com/questions/6734231/mysql-更新案例幫助) – nawfal

回答

18

難道你沒有忘記在病例陳述中做「否」嗎?

UPDATE my_table 
    SET field = CASE 
     WHEN id IN (/* true ids */) THEN TRUE 
     WHEN id IN (/* false ids */) THEN FALSE 
     ELSE field=field 
    END 

沒有ELSE,我假設評估鏈停在最後一個WHEN並執行該更新。此外,您不限制您嘗試更新的行;如果你不做ELSE,你至少應該告訴更新只更新你想要的行,而不是所有的行(如你所做的那樣)。看看下面的WHERE子句:

UPDATE my_table 
     SET field = CASE 
      WHEN id IN (/* true ids */) THEN TRUE 
      WHEN id IN (/* false ids */) THEN FALSE 
     END 
    WHERE id in (true ids + false_ids) 
+0

謝謝@Icarus - 你發佈的第二個解決方案是完美的。雖然第一個工作當然是,MySQL匹配表中的每一行;這似乎很容易導致在較大的表(* 10^6行或更多*)中導致性能損失,儘管它只是實際更新已更改的行。你能對此有所瞭解嗎? (*所有目標ID聯盟的條件是一個足夠乾淨的解決方案,但我只是好奇*) – Dan

+1

@TomcatExodus:我不知道我很理解你的問題,但是,一般來說,如果你有一個更新沒有數據庫引擎幾乎肯定必須執行表掃描並且會損害性能,特別是在大型表中。所以是的,那裏的where子句應該更快,但只有id列也是索引。如果不是,則表掃描是不可避免的。 – Icarus

+0

好的@Icarus - 這就是我的意思,'id'列被索引。我指的是輸出流;如果沒有'WHERE'子句,我會得到幾千行匹配的行,但只有少數行受到影響。被匹配的數千個是我想避免的全表掃描,並且通過應用'WHERE'子句避免了*,*僅僅指定了真/假ID的聯合。只是想澄清一下。謝謝! – Dan

4

就可以避免字段=場

update my_table 
    set field = case 
     when id in (....) then true 
     when id in (...) then false 
     else field 
    end 
的[MySQL的更新情況說明](
+0

謝謝@nick rulez - 「field = field」乍一看也很奇怪(* field = field = field * *) – Dan