2011-02-15 141 views
5

我可以使用一個查詢更新多行嗎?使用一個查詢更新多行

如何工會以下查詢:

UPDATE tablename SET col1='34355' WHERE id='2' 

UPDATE tablename SET col1='152242' WHERE id='44' 
+2

你爲什麼要這樣做? – CanSpice 2011-02-15 18:56:06

回答

1

您可以使用OR條款與IF()功能組合(或CASE WHEN...其他RDBMS)

UPDATE tablename SET col1 = IF(id='2', '34355','152242') 
WHERE id='2' OR id='44' 
+1

對於很長一段時間的更新,僅僅做單個更新查詢會比較容易,而不是構建這個可怕的怪物。這個版本的唯一好處是它可以分類 - 可以模擬非事務感知型數據庫上的事務。 – 2011-02-15 18:58:44

+0

@ marc-b OP詢問了2行。另一個缺點是,如果列表很大,解析器可能會選擇表掃描而不是索引合併。 – 2011-02-15 19:00:48

0

一般來說,只有這樣,你可以更新多個如果您的where子句匹配多行,那麼單個查詢中的行就是......然後每行都會設置相同的值。

過去你可以在你的set子句中使用表達式來做一些時髦的事情,但是一般來說,做多個查詢是很乾淨的,除非你有一個非常特殊的原因。

2

你能嗎?當然。你應該?沒門。

想想在五年內看着你的代碼的人。更重要的是可讀的,這樣的:

UPDATE tablename SET col1='34355' WHERE id='2'; 
UPDATE tablename SET col1='152242' WHERE id='44'; 

或本(Scrum的梅斯特的答案):

UPDATE tablename SET col1 = IF(id='2', '34355','152242') WHERE id='2' OR id='44'; 

第二個是短,但它是要弄清楚到底是什麼在做一個挑戰。如果你擔心競爭條件,使其成爲一個單一的交易(在大多數現代DBMS):

BEGIN; 
UPDATE tablename SET col1='34355' WHERE id='2'; 
UPDATE tablename SET col1='152242' WHERE id='44'; 
COMMIT; 

可以得到保證時,第2行被更新沒有其他的查詢將運行,但排44這樣是不是。

4

您可以使用虛擬映射表進行此更新。

update tablename 
inner join (
    select '34355' col1, '2' id union all 
    select '152242' col1, '44' id 
) map on map.id = tablename.id 
set tablename.col1 = map.col1 

使用此模式允許輕鬆擴展(只需將行添加到地圖中)。它還允許MySQL更可預測地選擇tablename.id上的索引來進行正常的JOIN操作。