2011-11-03 118 views
1

我想知道這個查詢會做更新一列兩次:在同一個查詢

UPDATE users SET 
PaymentAmount = PaymentAmount + TempPaymentAmount, 
PaymentDuration = PaymentDuration + TempPaymentDuration, 
TempPaymentAmount = NULL, 
TempPaymentDuration = NULL 
WHERE UserID = 1234 

你會發現,我試圖從臨時列中的值複製到原始列並註銷其與此同時。我想知道如果查詢將做我所期望的。

+3

有沒有什麼理由不能運行它並找出答案? – Connell

+0

@Connell:活的數據庫...壞主意。 –

+4

但是這種情況非常簡單 - 在一個測試服務器上創建一個新表並嘗試一下就沒有問題了...... – Jan

回答

2

例如值列(用戶ID = 1234)的以下內容:

PaymentAmount = 10 
PaymentDuration = 30 
TempPaymentDuration = 40 
TempPaymentAmount = 50 

查詢執行後:

PaymentAmount = PaymentAmount + TempPaymentAmount = 60 
PaymentDuration = PaymentDuration + TempPaymentDuration = 70 
TempPaymentAmount = NULL 
TempPaymentDuration = NULL 

MySQL 12.2.10. UPDATE Syntax

如果您訪問來自表中的列將被更新pression, UPDATE使用列的當前值。例如, 下面的語句設置COL1至一個比它的電流值更:

UPDATE t1 SET col1 = col1 + 1; 

另外一個interestign點:

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

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

任何機會MySQL都會決定以相反的方式執行任何操作,比如先消失,稍後再添加? –

+0

爲什麼TempPaymentAmount = 20和TempPaymentAmount = 50? –

+0

@Salman A:即使行爲會改變 - 只有在升級到新版本之前,您的行爲纔會受到影響。並且在每個版本升級之前,您總是應該閱讀文檔並在升級之前瞭解新版本的變化,以便您可以更新您的查詢 – sll

0

你爲什麼不給它一個嘗試和執行呢?

答案是肯定的:當您使用在同一查詢中修改的列中的值時,數據庫引擎將在計算更新值時採用未修改的值。

+0

上述答案另有說明:數據庫將使用* updated *列值,而不是原始值。 –

+0

Ähm,你的答案是你的答案?所有的答案告訴你,原來的(或當前的)價值將被使用 - 而不是更新... – Jan

0

它應該做的。我的什麼是實際發生的事情的理解是:#

UPDATE users SET 
:New.PaymentAmount = :Old.PaymentAmount + :Old.TempPaymentAmount, 
:New.PaymentDuration = :Old.PaymentDuration + :Old.TempPaymentDuration, 
:New.TempPaymentAmount = NULL, 
:New.TempPaymentDuration = NULL 
WHERE UserID = 1234 
1

應該工作,根據文檔(http://dev.mysql.com/doc/refman/5.0/ en/update.html):

單表的UPDATE賦值通常從左到右評估爲 。對於多表更新,並不保證 指定按任何特定順序執行。

所以,如果你運行它,它應該執行所有SET查詢一個接一個,因此首先使用原始值,則抵消了。

+1

這是一般*這個詞令我困惑。 –

+0

哈哈,你說得對,聽起來不太自信。然而,這直接來自將它拼湊在一起的人,所以獲得更多保證的唯一方法就是實際嘗試它,我猜... – kasimir