2014-02-20 79 views
0

我有一個2列的表:id和count。 Count是異或(只有其中一個可以同時爲1)。我需要更新計數= 1一行,需要把之前的計1爲0Mysql:更新全部或首先選擇並更新後?

我認爲兩種策略:

1)做一個選擇放在桌上,找到該行從1 更新爲0 更新,我想是在1

2)全球更新在計數表中的行0 更新,我想是在1

在第一種情況下,第i行做3查詢,但「小」。 在第二種情況下,我做了2個查詢,但其中一個是「大」。

哪種策略更好?

+0

無論花費的時間總體上我猜。在這兩種情況下,您都在進行兩項更新,但第一項中有一項額外選擇。所以只要看看是否改變了時間。 – Neels

+0

您可以結合策略(1)的兩個步驟:「在表上進行選擇,在1處找到行」,將其更新爲0。 –

回答

2

如果您只是交換兩行的值,您可以在單個查詢中完成。

例如。

+----+-------+ 
| id | count | 
+----+-------+ 
| 1 | 0  | 
| 2 | 0  | 
| 3 | 1  | 
+----+-------+ 

更新使用自聯接:

update myTable a, myTable b set 
    a.`count` = b.`count`, 
    b.`count` = a.`count` 
where a.id = '2' 
and b.id = '3' 

結果:

+----+-------+ 
| id | count | 
+----+-------+ 
| 1 | 0  | 
| 2 | 1  | 
| 3 | 0  | 
+----+-------+ 

如果你想針對特定行,你可以這樣做也。 例如。與ID 1行應該有一個計數爲1,並且無論目前有一個計數爲1應該被重置爲0.

update myTable a, myTable b set 
    a.`count` = 1, 
    b.`count` = 0 
where a.id = '1' 
and b.`count` = '1' 
+0

你試過這個嗎? –

+0

我總是測試,然後我發佈:) –

+0

最後一個例子是exacly我正在尋找。我不記得我可以打兩次同桌。 TNX – Atomico