2014-07-24 45 views
2

假設我有這個疑問:SQL UPDATE:在進一步列以前更新的列值

UPDATE TEST SET 
    a = a + 23, 
    b = (b+5)/a, 
    c = c + a + b 
WHERE 
    d = 6 
    OR 
    d = 10 

和列的初始值是

a = 0 
b = 5 
c = 10 

請問查詢崩潰,因爲0價值的a(所以(b+5)/a不會計算)或將已經有value = 23

一般問題是:在UPDATE statement中,用於更新其他列的值是已更新列的原始值還是更新值?

使用的數據庫是否有區別? MySQL,SQL Server,Oracle,DB2 ......?

編輯

什麼將是對「右側」更新值的最佳做法是什麼?

子查詢將工作嗎?

如何解決多值更新的問題?子查詢應該返回只值1

UPDATE TEST SET 
    a = a + 23, 
    b = (b+5)/(SELECT a FROM TEST WHERE d = 6), 
    c = c + a + b 
WHERE 
    d = 6 
    OR 
    d = 10 
+0

最好的做法是不要依賴更新後的值(不,子查詢不起作用),只使用你在那裏的值。 – Ryan

+0

因此,我必須先提取這些值......這意味着更多查詢的執行時間...... – Perocat

+0

在這種情況下,只需更新'b =(b + 5)/(a + 23),c = c +(a + 23)+((b + 5)/(a + 23))'。如果你的情況比這更復雜,請提供一個適當的例子,你可以使用變量。 – Ryan

回答

3

在我知道的所有SQL數據庫中,除了MySQL之外,所有更新都完全同時完成,這意味着b在更新時將爲零。

在MySQL,the updates are done in order,這意味着將23

A very simple PostgreSQL exampleMySQL example with a different result

+0

爲什麼選擇MySQL正在以另一種方式工作?有特別的原因嗎?將來有可能MySQL也會像其他DB一樣工作嗎? – Perocat

+2

@Perocat它只是[記錄是這種方式](http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-update.html),但我不知道爲什麼這是或者這種情況是否會在未來發生變化。 –

+0

謝謝!如果你能幫助我,我在原來的問題中增加了另一個問題! – Perocat

0

在所有符合ANSI的數據庫系統,事務是原子和孤立的,這意味着它們都在發生一次。您的查詢將爲給定值崩潰。