mysql進階(十四) 批次更新與批次更新多筆記錄的不同值實作方法
mysql 批次更新與批次更新多筆記錄的不同值實作方法
在mysql中批次更新我們可能使用update,replacecom批次更新與效能。 批次更新mysql更新語句很簡單,更新一條資料的某個字段,一般這樣寫:
UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';
如果同一字段如果同一值簡單,修改下
where
即可:
UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');
這裡注意'other_values'
那如果更新多個資料為不同的值,可能很多人會這樣寫:foreach ($display_order as $id => $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";
mysql_query($sql);
}
update一次,這樣效能很差,也很容易造成阻塞。
那麼能不能一條sql語句實現批次更新呢?
mysql並沒有提供直接的方法來實現批次更新,但是可以用點小技巧來實現。 UPDATE mytable
SET myfield = CASE id
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
舉例:UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)
sql的意思是,更新
的意思是,更新 display_order 的值為3,如果id=2 則 display_order 的值 _order 的值是5 。 即是將條件語句寫在了一起。 這裡的where部分不影響程式碼的執行,但是會提高sql執行的效率。確保sql語句只執行需要修改的行數,這裡只有3條資料進行更新,而
where
子句如果更新多個值的話,只需要稍加修改:
UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END, title = CASE id WHEN 1 THEN 'New Title 1' WHEN 2 THEN 'New Title 2' WHEN 3 THEN 'New Title 3' END WHERE id IN (1,2,3)
$display_order = array( 1 => 4, 2 => 1, 3 => 2, 4 => 3, 5 => 9, 6 => 5, 7 => 8, 8 => 9 ); $ids = implode(',', array_keys($display_order)); $sql = "UPDATE categories SET display_order = CASE id "; foreach ($display_order as $id => $ordinal) { $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); } $sql .= "END WHERE id IN ($ids)"; echo $sql;
这个例子,有8条记录进行更新。代码也很容易理解,你学会了吗
性能分析
当我使用上万条记录利用mysql批量更新,发现使用最原始的批量update发现性能很差,将网上看到的总结一下一共有以下三种办法:
1.批量update,一条记录update一次,性能很差
update test_tbl set dr='2' where id=1;
2.replace into 或者insert into ...on duplicate key update
replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');
或者使用
insert into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y') on duplicate key update dr=values(dr);
3.创建临时表,先更新临时表,然后从临时表中update
create temporary table tmp(id int(4) primary key,dr varchar(50)); insert into tmp values (0,'gone'), (1,'xx'),...(m,'yy'); update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;
注意:这种方法需要用户有temporary 表的create 权限。
下面是上述方法update 100000条数据的性能测试结果:
逐条update
real 0m15.557s
user 0m1.684s
sys 0m1.372s
replace into
real 0m1.394s
user 0m0.060s
sys 0m0.012s
insert into on duplicate key update
real 0m1.474s
user 0m0.052s
sys 0m0.008s
create temporary table and update:
real 0m0.643s
user 0m0.064s
sys 0m0.004s
就测试结果来看,测试当时使用replace into性能较好。
replace into 和insert into on duplicate key update的不同在于:
replace into 操作本质是对重复的记录先delete 后insert,如果更新的字段不全会将缺失的字段置为缺省值
insert into 则是只update重复记录,不会改变其它字段。
QUESTION:
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect.
SOLVE:
原因是在safe mode下,要强制安全点,update只能跟where了, 要取消这个限制,可以:
SET SQL_SAFE_UPDATES=0;
以上就是mysql进阶(十四) 批量更新与批量更新多条记录的不同值实现方法 的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

標題:Oracle預存程序實現批次更新的步驟與注意事項在Oracle資料庫中,預存程序是一組為了提高資料庫效能、重複使用程式碼、增強安全性的SQL語句集合,透過預存程序可以實現批次更新資料的操作。本文將介紹如何使用Oracle預存程序實現批次更新,並提供具體的程式碼範例。步驟一:建立預存程序首先,我們需要建立一個預存過程,用來實現批次更新的操作。以下是建立預存程序的

Oracle儲存程序批次更新在資料處理中的應用案例在實際的資料處理中,我們經常需要對資料庫中的大量資料進行更新作業。 Oracle資料庫提供了預存程序的功能,可以有效處理這些大批量資料更新的操作,並提高資料處理效率和效能。在本文中,我們將介紹Oracle預存程序批次更新的應用案例,並提供具體的程式碼範例,幫助讀者更好地理解並運用此功能。案例背景假設我們有一個

Vue和Excel的默契合作:如何實現資料的批次更新和匯入引言:隨著資訊科技的快速發展,Excel表格作為一種流行的資料管理工具,被廣泛應用於各個產業和領域。同時,Vue作為一種靈活、高效的前端開發框架,也廣受歡迎。本文將介紹如何透過Vue和Excel的默契合作,實現資料的批次更新和匯入。為了幫助讀者更好地理解,我們將給出程式碼範例。實現資料批量更新:在V

在本文中,我們將看到如何在Hibernate中執行批次插入/更新。每當我們執行一條sql語句時,我們都是透過對資料庫進行網路呼叫來完成的。現在,如果我們必須在資料庫表中插入10個條目,那麼我們必須進行10次網路呼叫。相反,我們可以透過使用批次來優化網路呼叫。批次允許我們在單一網路呼叫中執行一組SQL語句。為了理解和實作這一點,讓我們定義我們的實體−@EntitypublicclassParent{@Id@GeneratedValue(strategy=GenerationType.AUTO)

Vue和Excel的高效組合:如何實現資料的批次更新和匯入隨著Web應用程式的不斷發展和資料量的不斷增加,我們經常會遇到需要批次更新和匯入資料的情況。而Excel作為廣泛使用的電子表格工具,具有強大的資料處理和匯入匯出功能,成為我們處理大量資料的首選工具之一。本文將介紹如何使用Vue和Excel實現資料的批次更新和匯入,以提高資料處理的效率。首先,我們需

Java開發中如何解決資料庫更新效能問題摘要:隨著資料量的增加和業務的變化,資料庫更新的效能問題成為了Java開發中一大挑戰。本文將介紹一些常見的解決資料庫更新效能問題的方法和技巧。關鍵字:Java開發,資料庫,更新效能問題,解決方法引言:在大多數Java應用程式中,資料庫扮演著重要的角色。資料庫的效能直接影響了應用程式的反應速度和穩定性。而在實際開發中,數

MySQL是一種廣泛使用的關聯式資料庫管理系統,其提供了許多有效的資料操作方法。當需要更新大量資料時,可以使用批次更新方法來提高效率。本文將介紹MySQL中的批次更新方法。一、什麼是批次更新?批次更新是指透過一條SQL語句來更新多個資料行。相較於每次更新一行的方法,批次更新能夠有效降低資料庫的負載和網路傳輸時間,提升資料操作的效率和速度。二、批次更新的實現方

標題:Oracle預存程序批次更新實作方法在Oracle資料庫中,使用預存程序批次更新資料是常見的操作。透過大量更新可以提高資料處理的效率,減少對資料庫的頻繁訪問,同時也能減少程式碼的複雜性。本文將介紹如何在Oracle資料庫中使用預存程序實作批次更新資料的方法,並給出具體的程式碼範例。首先,我們需要建立一個預存程序,該過程將實現批量更新資料的功能。下面
