我可以使用一個查詢更新多行嗎?使用一個查詢更新多行
如何工會以下查詢:
UPDATE tablename SET col1='34355' WHERE id='2'
UPDATE tablename SET col1='152242' WHERE id='44'
我可以使用一個查詢更新多行嗎?使用一個查詢更新多行
如何工會以下查詢:
UPDATE tablename SET col1='34355' WHERE id='2'
UPDATE tablename SET col1='152242' WHERE id='44'
您可以使用OR
條款與IF()
功能組合(或CASE WHEN...
其他RDBMS)
UPDATE tablename SET col1 = IF(id='2', '34355','152242')
WHERE id='2' OR id='44'
對於很長一段時間的更新,僅僅做單個更新查詢會比較容易,而不是構建這個可怕的怪物。這個版本的唯一好處是它可以分類 - 可以模擬非事務感知型數據庫上的事務。 – 2011-02-15 18:58:44
@ marc-b OP詢問了2行。另一個缺點是,如果列表很大,解析器可能會選擇表掃描而不是索引合併。 – 2011-02-15 19:00:48
一般來說,只有這樣,你可以更新多個如果您的where子句匹配多行,那麼單個查詢中的行就是......然後每行都會設置相同的值。
過去你可以在你的set子句中使用表達式來做一些時髦的事情,但是一般來說,做多個查詢是很乾淨的,除非你有一個非常特殊的原因。
你能嗎?當然。你應該?沒門。
想想在五年內看着你的代碼的人。更重要的是可讀的,這樣的:
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這樣是不是。
您可以使用虛擬映射表進行此更新。
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操作。
你爲什麼要這樣做? – CanSpice 2011-02-15 18:56:06