php之批量更新mysql資料庫字段

2021-08-01 08:51:54 字數 2301 閱讀 2301

為了提高資料庫的響應速度,希望僅通過訪問一次資料庫完成對乙個欄位中多個記錄的更新操作,也就是批量更新,在網上查了許多關於批量更新的例子,一直沒找合適的,不過網上的資料給了我不少啟發,現將這幾天實現的**與大家分享。

首先簡述一下我的問題,目的:根據資料庫中的id欄位實現對所有score欄位的更新,假設有200張,即200個記錄。資料庫中的update操作可以說是非常耗時的,有些人寧願使用delete加insert操作完成,也不願意用update。但是有些情況並不適用。

首先上傳之前沒有優化的**,即一行一行的迴圈更新,即多次訪問資料庫。

$query =  'select * from facemash where ia = 1';

$result = mysql_query ($query);

while ( $obj = mysql_fetch_object ( $result ) )

$learn_rate = 0.1;

$lamba = 0.01;

foreach ($return as $value)$sql = sprintf('update facemash set score = "%f" where id = "%s"',$value->score,$value->id)

$result = mysql_query ($sql);}

1、小批量的更新

$sql = "update facemash set score = case id 

when '0141e381ed555a95fc8974cb1d6affd9' then 121.44

when '018949c3e777d50802ae4ad4e36b4413' then 121.46022

when '034f48f56a758f3565ad5c76a8b18b49' then 98

end where id in ('0141e381ed555a95fc8974cb1d6affd9','018949c3e777d50802ae4ad4e36b4413','034f48f56a758f3565ad5c76a8b18b49')";

$result = mysql_query ( $sql ) or die(mysql_error());

缺點:只能手動將填寫修改後的值及主鍵值,效率低,不適用於規模大的記錄。

2、大批量的更新,這裡直接上我修改好的。

foreach ($return1 as $value)

$ids = implode(',',$id_array);

$sql = "update facemash set score = case id ";

for($i=0; $iscore-$x1->score)*($x1->score-$x2->score)+2*$lamba*$value->score;

$value->score = $value->score - $learn_rate*$grad;

$value_array = $value->score;

$string_id = sprintf("'%s'",$value->id);

$id_array = $string_id;

}$ids = implode(',',$id_array);

$sql = "update facemash set score = case id ";

for($i=0; $i思路是:先求出欄位更新之後所有的值存放在陣列當中,然後在迴圈之外一併提交完成更新。這裡更新的是score欄位,主鍵是id,關鍵在於如何讓資料庫執行的時候將主鍵和得分一一對應起來,格式很重要。

$sql = "update facemash set score = case id ";

for($i=0; $i這一步最為關鍵,主要是變數$ids的格式,可能大家都在網上查到加上這一句$ids = implode(',',$id_array);資料庫就能識別出每乙個id對應的字串了,這得取決於陣列$id_array的形式了,查詢所返回的結果id,如果直接存入$id_array,在執行完implode語句之後,就會把$ids當成乙個字串,儘管我們知道有","分割,但是這個字串不能被in關鍵字當做若干個id的集合,只有在每個id字串加上單引號,才能識別出,這一步花了好長時間才ok,那如何加引號呢?只要在建立$id_array陣列,對每乙個id格式化輸出即可,沒錯,就是加這一句

$string_id = sprintf("'%s'",$value->id);

$id_array = $string_id;

到這裡所有問題基本解決,當然,並不是所有都要加引號,假如前面的鍵值是數字的話,加上逗號,in關鍵字還是能夠識別出來的。

MySQL 批量更新資料

最近做的乙個專案有這個乙個需求,就是記錄每個訊息的檢視數。規則是只要客戶端呼叫訊息列表,就把當前介面返回的資料對應的資料庫裡面的檢視欄位 1。做的是後端給前端一次返回20條資料,那麼就存在,後端需要一次跟新這20條記錄的檢視數。這就是設計到mysql的批量更新操作了。訊息表message idcon...

mysql批量更新資料

1.使用 on duplicate key update,該語句是如果存在就修改,如果不存在就插入.以下是兩種用法 insert into wx sms id values 10 11 12 on duplicate key update userid userid 100 insert into ...

mysql 批量更新 MySQL批量更新

我有2個表 mysql data details accounts invoices 理想情況下,每個data details都應具有accounts invoices id.data details有乙個帶有accounts invoices主鍵的外來鍵 由於某種原因,有data details記...