非常簡單的問題,但我找不到答案。UPDATE語句是否同時設置所有的值(同時)?
假設我有表var
與列foo
和bar
,這兩者都是整數,在0目前。
如果我運行:
UPDATE var SET foo=foo+1, bar=foo+1
那麼會是怎樣的bar
價值? 1或2?
如果我切換訂單,它會改變嗎?
UPDATE var SET bar=foo+1, foo=foo+1
非常簡單的問題,但我找不到答案。UPDATE語句是否同時設置所有的值(同時)?
假設我有表var
與列foo
和bar
,這兩者都是整數,在0目前。
如果我運行:
UPDATE var SET foo=foo+1, bar=foo+1
那麼會是怎樣的bar
價值? 1或2?
如果我切換訂單,它會改變嗎?
UPDATE var SET bar=foo+1, foo=foo+1
如Joe's SQL Fiddle comment表示,它確實不管執行什麼順序列更新。爲UPDATE
MySQL的文檔表明這一點,指出每個列的更新表達式將會在訂單中評估聲明,它總是使用列的「當前」值:
如果從訪問列表在表達式中被更新,
UPDATE
使用該列的當前值。例如,下面的語句設置比其當前值col1
多了一個:UPDATE t1 SET col1 = col1 + 1;
下面的語句中的第二個分配集合
col2
當前(已更新)col1
價值,而不是原來的col1
值。結果是col1
和col2
具有相同的值。此行爲不同於標準SQL。UPDATE t1 SET col1 = col1 + 1, col2 = col1;
單表更新的任務一般是評估由左到右。對於多表更新,不保證分配按任何特定順序執行。
所以對於UPDATE var SET foo=foo+1, bar=foo+1
,foo
將被設置爲foo+1
,那麼bar
更新將在foo+1
使用foo
新設置的值。
也許值得注意的是,這種行爲不同於SQL標準,這表明所有列更新應該在概念上「同時」發生。
富= 1,巴= 1不管順序[編輯:在MS-SQL。 (顯然我在MySQL中不好)]
註釋中的SQL小提琴鏈接表明,這不是MySQL中的情況 – 2013-02-20 20:30:51
該命令在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));
注意一下 - 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
沒有增量語句,因此如果foo = 0,那麼你將在兩列中得到1,1。 – BaconSah 2013-02-20 20:13:08
增量語句是什麼樣的? (如果我想'bar'成爲2) – hellohellosharp 2013-02-20 20:13:59
你將不得不使用一個循環 做 直到 一套 = VAL VAL + 1 結束 直到 作爲 僞說法,即在存儲過程或在主程序。是的,我同意這是一個騙局。 – BaconSah 2013-02-20 20:18:02