2013-02-20 90 views
4

非常簡單的問題,但我找不到答案。UPDATE語句是否同時設置所有的值(同時)?

假設我有表var與列foobar,這兩者都是整數,在0目前。

如果我運行:

UPDATE var SET foo=foo+1, bar=foo+1

那麼會是怎樣的bar價值? 1或2?

如果我切換訂單,它會改變嗎?

UPDATE var SET bar=foo+1, foo=foo+1

+0

沒有增量語句,因此如果foo = 0,那麼你將在兩列中得到1,1。 – BaconSah 2013-02-20 20:13:08

+0

增量語句是什麼樣的? (如果我想'bar'成爲2) – hellohellosharp 2013-02-20 20:13:59

+0

你將不得不使用一個循環 做 直到 一套 = VAL VAL + 1 結束 直到 作爲 僞說法,即在存儲過程或在主程序。是的,我同意這是一個騙局。 – BaconSah 2013-02-20 20:18:02

回答

7

Joe's SQL Fiddle comment表示,它確實不管執行什麼順序列更新。爲UPDATE MySQL的文檔表明這一點,指出每個列的更新表達式將會在訂單中評估聲明,它總是使用列的「當前」值:

如果從訪問列表在表達式中被更新,UPDATE使用該列的當前值。例如,下面的語句設置比其當前值col1多了一個:

UPDATE t1 SET col1 = col1 + 1; 

下面的語句中的第二個分配集合col2當前(已更新)col1價值,而不是原來的col1值。結果是col1col2具有相同的值。此行爲不同於標準SQL。

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

單表更新的任務一般是評估由左到右。對於多表更新,不保證分配按任何特定順序執行。

所以對於UPDATE var SET foo=foo+1, bar=foo+1foo將被設置爲foo+1,那麼bar更新將在foo+1使用foo新設置的值。

也許值得注意的是,這種行爲不同於SQL標準,這表明所有列更新應該在概念上「同時」發生。

-2

富= 1,巴= 1不管順序[編輯:在MS-SQL。 (顯然我在MySQL中不好)]

+1

註釋中的SQL小提琴鏈接表明,這不是MySQL中的情況 – 2013-02-20 20:30:51

2

該命令在MySQL中很重要。此外,你可以做到以下幾點:

update test set foo=foo+1, bar=foo+1, foo=bar+1; 

BTW,這裏是另一個有用的MySQL特定技巧:

insert into test (foo, bar) values ('some text', MD5(foo)); 
0

注意一下 - PostgreSQL的查詢,同時執行查詢時

create table test (
field1 int2 default 0, 
field2 int2 default 0 
); 


insert into test values (1, 2); 


update test set field1 = field2, field2 = field1 +1; 


select * from test; 

結果的查詢,而不是動態變化值開始用值來執行:

field1, field2 
    2,2