通常情況下,我們會使用以下sql語句來更新字段值:
update mytable set myfield='value'
where other_field='other_value';
但是,如果你想更新多行資料,並且每行記錄的各字段值都是各不一樣,你會怎麼辦呢?剛開始你可能會想到使用迴圈執行多條update語句的方式,就像以下的php程式示例:
foreach ($display_order
as$id => $ordinal)
這種方法並沒有什麼任何錯誤,並且**簡單易懂,但是在迴圈語句中執行了不止一次sql查詢,在做系統優化的時候,我們總是想盡可能的減少資料庫查詢的次數,以減少資源占用,同時可以提高系統速度。幸運的是,還有更好的解決方案,只不過sql語句稍微複雜點,但是只需執行一次查詢即可,語法如下:
update mytable
set myfield = case other_field
when
1then
'value'
when
2then
'value'
when
3then
'value'
endwhere id in (1,2,3)
這樣的sql語句是很容易理解的,也就是用到了很多程式語言都有的關鍵字 case,根據id欄位值來進行不同分支的當型判斷,
如果你需要更新一行記錄的多個字段,可以用以下sql語句:
update categories
set display_order = case id
when
1then
3when
2then
4when
3then
5end,
title = case id
when
1then
'new title 1'
when
2then
'new title 2'
when
3then
'new title 3'
endwhere id in (1,2,3)
以上方案大大減少了資料庫的查詢操作次數,大大節約了系統資源,但是該怎樣與我們的程式語言結合起來呢?我們還是用剛才分類目錄的例子,以下是php的程式示例:
在這個例子中總共更新了8行資料,但是只執行了一次資料庫查詢,相比於迴圈執行8次update語句,以上例子所節約的時間可以說是微不足道的。但是想想,當你需要更新10,0000或者更多行記錄時,你會發現這其中的好處!唯一要注意的問題是sql語句的長度,需要考慮程式執行環境所支援的字串長度,當然這也可以更新mysql的設定來擴充套件。
優化一條UPDATE語句
最近見到一條開發人員寫的update語句,覺得沒什麼不對,可又覺得有地方不對,因為效能低下.update a set col2,col3 select col1,t from b where b.col1 a.col1 where exists select b.col1 from b where ...
一條Update語句實現兩列值的交換
趙老闆,前些日子去某軟體公司筆試去了,拿到試卷,第乙個題就是 用一條update交換兩列的值 當然表是給定的。這還不簡單,上去就要寫,可是寫不出來,交換值肯定要用乙個中間變數來儲存。左思右想,還是沒有想出來,放棄,做下乙個題。趙老闆回來問這個自稱是sql高手的高總,聽了以後我的頭腦也暈了,沒有思路,...
檢視一條mysql語句的效能
mysql資料庫在5.0.37版本後新增了show profiles功能,可以分析出一條sql語句的效能。檢查資料庫是否支援show profiles功能 show variables like version 檢視profiles是否開啟 show variables like pro 開啟命令 ...