2017-04-07 62 views
1

更新在一個更新語句多列時,我有一個更新查詢:更新序列中的SQL

update t 
set  Col6=Col5 
    , Col5=Col4 
    , Col4=Col3 
    , Col3=Col2 
    , Col2=Col1 
from [table] t 

是否SQL做序列中的更新?首先更新Col6,然後更新Col5等等? 我不想在Col3中看到Col1編號/數據,以防SQL在更新Col3之前通過某種優化的查詢計劃更新Col2。如果是這樣,我將不得不分別寫出所有5列更新語句。

回答

0

指定的列沿用存儲在數據庫行的值分配不發生nevevr上飛

例如:如果你的數據庫行你有

col5 = 1 
col4 = 3 

了您的更新產生這種結果

col6 = 1 
col5= 3 
1

一般情況下,SQL更新對待set的左右兩側從兩個不同的記錄來 - 記錄「前的」在右側d左邊的「之後」記錄。在實踐中,大多數數據庫按順序評估集合子句(我不確定這是否是必需的)。

MySQL是不同的。它按順序評估設置的子句。 對賦值後的列的引用是新值,而不是舊值。這是在documentation解釋說:

下面的語句中的第二個任務將COL2到 電流(更新)COL1值,而不是原來的col1值。結果 是col1和col2具有相同的值。此行爲與標準SQL 不同。

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

所以,你的書面保證聲明,以便進行評估。因爲您沒有提及已分配的值,所以它按照您的預期工作,並且記錄在案。

+0

該文件說單表更新將按順序,但多表更新可能不會。所以,如果我的更新是象下面這樣: 更新T1 集t1.Col6 = t1.Col5 ,t1.Col5 = t1.Col4 ,t1.Col4 = t1.Col3 ,t1.Col3 = t1.Col2 ,T1 .Col2 = t1.Col1 ,t1.Col1 = t2.Col0 from [table1] t1 join table2 t2 on t2.id = t1.id 這會被認爲是單表更新還是多重? (我假設它是單身) – Abhishek

+0

@Abhishek。 。 。這將是單表語法。但我必須強調,該語法是SQL Server語法,而不是MySQL語法。如果你誤解了這個問題,我會建議你問另外一個問題,清楚地說明你正在使用的實際數據庫。 (這個問題有4個答案,所有這些答案都基於MySQL;更改數據庫會使這些答案失效。) –

0

使用此格式:

UPDATE table-name 
    SET column-name = value, column-name = value, ... 
WHERE condition 
0

您的查詢不包含where子句,因此,每一行都將被更新。大多數關係型引擎通過維護舊的和新的值來工作(更多關於這個概念的調查觸發器)。您創建的查詢是將存儲在一列中的舊值分配給另一列中的新值。

create table test (col1 int, col2 int, col3 int, col4 int, col5 int, col6 int); 
insert into test values (1,2,3,4,5,6), (10,20,30,40,50,60); 
commit; 

select * from test; 
+------+------+------+------+------+------+ 
| col1 | col2 | col3 | col4 | col5 | col6 | 
------+------+------+------+------+------+ 
| 1 | 2 | 3 | 4 | 5 | 6 | 
| 10 | 20 | 30 | 40 | 50 | 60 | 
+------+------+------+------+------+------+ 
2 rows in set (0.00 sec) 

update test 
set Col6=Col5 
, Col5=Col4 
, Col4=Col3 
, Col3=Col2 
, Col2=Col1; 
commit; 

select * from test; 
+------+------+------+------+------+------+ 
| col1 | col2 | col3 | col4 | col5 | col6 | 
+------+------+------+------+------+------+ 
| 1 | 1 | 2 | 3 | 4 | 5 | 
| 10 | 10 | 20 | 30 | 40 | 50 | 
+------+------+------+------+------+------+ 
2 rows in set (0.00 sec) 

如上所示,col6包含5中的內容,5中的內容等等。 Col1保留原來的值,因爲它沒有被重新定義。

那麼如果我們試圖引用更改的值會發生什麼?

update test 
set Col1=Col2 
, Col2=Col3 
, Col3=Col4 
, Col4=Col5 
, Col5=Col6; 
commit; 

select * from test; 
+------+------+------+------+------+------+ 
| col1 | col2 | col3 | col4 | col5 | col6 | 
+------+------+------+------+------+------+ 
| 1 | 2 | 3 | 4 | 5 | 5 | 
| 10 | 20 | 30 | 40 | 50 | 50 | 
+------+------+------+------+------+------+ 
2 rows in set (0.00 sec) 

正如您所見,MySQL按照預期將相應的值分配到列中。由於未定義新值,Col6未更新。