1. 程式人生 > >mysql進階(十四) 批量更新與批量更新多條記錄的不同值實現方法

mysql進階(十四) 批量更新與批量更新多條記錄的不同值實現方法

mysql 批量更新與批量更新多條記錄的不同值實現方法

mysql中批量更新我們可能使用update,replace into來操作,下面詳細介紹mysql批量更新與效能

批量更新

mysql更新語句很簡單,更新一條資料的某個欄位,一般這樣寫:

UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

如果更新同一欄位為同一個值,mysql也很簡單,修改下where即可:

 UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

這裡注意‘other_values' 是一個逗號(,)分隔的字串,如:1,2,3

那如果更新多條資料為不同的值,可能很多人會這樣寫:

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)

這裡使用了case when 這個小技巧來實現批量更新。

舉個例子:

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 欄位,如果id=1 display_order 的值為3,如果id=2 則 display_order 的值為4,如果id=3 則 display_order 的值為5

即是將條件語句寫在了一起。

這裡的where部分不影響程式碼的執行,但是會提高sql執行的效率。確保sql語句僅執行需要修改的行數,這裡只有3條資料進行更新,而where子句確保只有3行資料執行。

如果更新多個值的話,只需要稍加修改:

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)

到這裡,已經完成一條mysql語句更新多條記錄了。

但是要在業務中運用,需要結合服務端語言,這裡以php為例,構造這條mysql語句:

$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 批量更新批量更新記錄不同實現方法

mysql 批量更新與批量更新多條記錄的不同值實現方法 在mysql中批量更新我們可能使用update,replace into來操作,下面詳細介紹mysql批量更新與效能。 批量更新 mysql更新語句很簡單,更新一條資料的某個欄位,一般這樣寫: UP

mysql() 批量更新批量更新記錄不同實現方法

mysql 批量更新與批量更新多條記錄的不同值實現方法 在mysql中批量更新我們可能使用update,replace into來操作,下面詳細介紹mysql批量更新與效能。 批量更新 mysql更新語句很簡單,更新一條資料的某個欄位,一般這樣寫: UPDATE myt

mysql(五) mysql批量刪除大量資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql mysql批量刪除大量資料

mysql批量刪除大量資料 假設有一個表(syslogs)有1000萬條記錄,需要在業務不停止的情況下刪除其中statusid=1的所有記錄,差不多有600萬條, 直接執行 DELETE FROM syslogs WHERE statusi

mysql mysql批量刪除大量數據

lock led http cap logs 所有 family 因此 我們 mysql批量刪除大量數據 假設有一個表(syslogs)有1000萬條記錄,需要在業務不停止的情況下刪除其中statusid=1的所有記錄,差不多有600萬條, 直接執行 DELETE FRO

mysql(七)Cannot Connect to Database Server

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql(九)SQL語句如何精準查詢某一時間段的資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql 批量更新批量更新記錄不同實現方法

批量更新 mysql更新語句很簡單,更新一條資料的某個欄位,一般這樣寫: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';   如果更新同一欄位為同一個值,mysql也很簡單,修改

Python()- 基礎課程結課總結:高階函式

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(十四)- 基礎課程結課總結:高階函式

mysql 九 SQL語句如何精準查詢某一時間段的資料

SQL語句如何精準查詢某一時間段的資料       在專案開發過程中,自己需要查詢出一定時間段內的交易。故需要在sql查詢語句中加入日期時間要素,sql語句如何實現?       SELECT * FROM 

mysql 九 SQL語句如何精準查找某一時間段的數據

lmap 數據 ont and 需要 class 實現 項目開發 href SQL語句如何精準查找某一時間段的數據 在項目開發過程中,自己需要查詢出一定時間段內的交易。故需要在sql查詢語句中加入日期時間要素,sql語句如何實現? SELECT *

mysql(一)外來鍵在資料庫中的作用

MySQL外來鍵在資料庫中的作用      MySQL外來鍵的目的是控制儲存在外來鍵表中的資料,使兩張表形成關聯,是MySQL資料庫中非常重要的組成部分,值得我們去深入瞭解。那麼,MySQL外來鍵究竟起到哪些作用呢?下文就將帶您一探其中的祕密。MySQL外來鍵的作用    

Java()實現每天定時對資料庫的操作

Java實現每天定時對資料庫操作 現在有一個很棘手的問題:客戶要求實現一個功能,就是每日凌晨自動計算慢性病訂單是否有需要在今日提醒的,如果有則生成一條提醒記錄到lm_notice之中。 如何在We

mysql 開發篇系列 52 許可權安全(系統個許可權表的粒度控制關係)

一.概述   接著上篇的許可權介紹,當用戶進行連線的時候,許可權表的存取過程有以下兩個階段:   (1) 先從user表中的host,user, authentication_string 這3個欄位中判斷連線的ip,使用者名稱,密碼是否存在於表中,如果存在,則通過身份驗證。   (2) 通過驗證後,則按照以

mysql(二)之細談索引、分頁慢日誌

連表 組合索引 rar 偏移量 最小值 num glob 要求 for 索引 1、數據庫索引   數據庫索引是一種數據結構,可以以額外的寫入和存儲空間為代價來提高數據庫表上的數據檢索操作的速度,以維護索引數據結構。索引用於快速定位數據,而無需在每次訪問數據庫表時搜索數據

ArcGIS 高級地圖緩存技術[5] 地圖緩存(三)——緩存的更新遷移

分享 win paste margin 地圖 com left 導入 block 1.緩存遷移 在ArcGIS 10 中新加入導入/導出緩存工具 能在緊湊和松散緩存之間轉換 可以導出為離線緩存 2.拷貝緩存 1)緊湊型緩存 可使用任意工具 2)松散型緩存 Win

MYSQL學習筆記八:MySQL備份和還原!(視頻序號:_37)

back 系統 結構 生產 下載地址 family 需要 絕對路徑 isa 知識點十九:MySQL的備份的還原(38)   一、mysql的備份       1、通過使用mysqldump的命令備份         使用mysqldump命令備份,mysqldump命令將數

MySQL之存儲引擎MyISAMInnoDB的區別

存儲引擎 內存數據 數據庫管理系統 l數據庫 cms 就是 innodb 後臺 ODB 一、存儲引擎(表類型) 通常意義上,數據庫就是數據的集合,具體到計算機數據庫可以是存儲器上一些文件的集合或一些內存數據的集合。我們通常說的MySQL數據庫、sql Server數據庫等

mysql 開發篇系列 54 許可權安全(賬號管理的各種許可權操作 下)

1. 檢視許可權 -- 如果host值不是%, 就要加上host值,下面檢視bkpuser使用者許可權(6個許可權, 限本地連線) SHOW GRANTS FOR bkpuser@localhost;      -- 如果host值是%, 就只要輸入使用者名稱,下面檢視z1使用者許可權(

mysql 開發篇系列 51 許可權安全(許可權表user,db詳細介紹 )

一.概述   mysql 的許可權系統主要用來對連線到資料庫的使用者進行許可權驗證,以此來判斷此使用者是否屬於合法使用者,以及合法使用者給予的相應資料庫許可權。下面將介紹許可權系統的工作原理,以及將要熟練掌握賬號的管理和使用方法(mysql版本 5.7)。   1.1  許可權系統的