2012-04-04 18 views
1

我正在使用MySQL InnoDB。MySQL - 在單個查詢中更新列的順序

我想更新一個表並控制每列更新的順序。所有在一個查詢如果可能的話。原因是我有一個遊戲隊列系統。當你完成queue_1時,我希望爲它分配queue_2的值,然後擦除queue_2。

現在我收到了不可預測的結果。有時total_price_2設置爲零,則加載到total_price_1。兩者都變爲零。 (不是我想要的。)

我讀到DB決定運行更新的順序。如果我必須做兩個更新,那很好。我的目標是表現。

UPDATE 
queue 
SET  
queue_1 = queue_2, 
total_price_1 = total_price_2, 
total_wait_1 = total_wait_2, 
queue_2 = '', 
total_price_2 = 0, 
total_wait_2 = 0 
WHERE id IN(1,2,3) 
+1

您確定'total_price_2'在更新之前不是'0'嗎? – MichaelRushton 2012-04-04 08:12:34

+0

@MichaelRushton好想法。在您的評論後,我正在嘗試自己的查詢,而不是在代碼中的自然上下文中查詢。 7次嘗試,每次都在努力。使用我給它的訂單。我會繼續嗅探並回傳。 – Dor1000 2012-04-04 08:25:15

+0

我在更新之前和之後選擇並回顯隊列數據。我發現我的更新正在按計劃進行,但其他情況在後來改變了這些值。氙氣在這方面有一個很好的答案。 – Dor1000 2012-04-04 08:44:55

回答

2

檢查total_price_2在更新之前不是0,如MichaelRushton所示。

單表UPDATE分配一般是由左向右進行評估:

在MySQL,單表UPDATE查詢從「從左到右」,其在本UPDATE聲明文檔中所述進行處理。對於多表更新,不保證分配按任何特定順序執行。 (Source

具體地,請注意本實施例中:

在下面的語句集COL2到當前(更新)值COL1,而不是原來的col1值的第二指派。結果是col1和col2具有相同的值。此行爲不同於標準SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1; 


旁註

作爲一個位一個側面說明,你也可以明確指定的順序爲通過使用ORDER BY條款進行更新:

沒有WHERE子句,所有行都被更新。如果指定了ORDER BY子句,則按照指定的順序更新行。 (Source

0

拆分queue_1queue_2您更新查詢。

進行一次更新查詢queue_1,另一個用於queue_2, 因爲MySQL變得迷茫的時候它更新的值,它queue_1,這使得你的結果0之前更新queue_2

0

值得一提的是,如果你是依賴於依賴服務器的行爲,如所暗示的This behavior differs from standard SQL,你需要在今後要細心。如果你改變DB呢?或者別人更新了代碼而沒有意識到排序的重要性?

將更新拆分爲兩個明確的語句並使用事務來確保它們以原子方式運行可能會更好。

+0

好點。我有一個文本文件,可以在筆記上記錄我的項目,供將來參考。我將添加一個註釋,即移動隊列是爲MySQL編碼的。我會在代碼中添加一條評論,說明它的順序非常敏感。感謝Cylindric。 – Dor1000 2012-04-05 04:59:04