本篇文章給大家分享的內容是關於PHP如何批量更新MYSQL中的數據,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。
在這個業務裡裡面涉及到了更新兩張資料表,那麼大家是不是會想到非常簡單,馬上上程式碼
$sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";
其中資料表名為newhouse_clicks,有四個字段,主鍵id,type(類型-整型)字段,clicks(點擊量-整數)字段,update_time(整數)字段
這樣做確實沒有問題嗎?比如說大量更新目前城市下的所有樓盤,比如說北京,打個比方1000條數據,那麼在業務裡面是不是就要這樣寫
$data = array(id=>1,id=>2,..........id=>1000);//省略数据 foreach($data as $key=>$value) { $sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']"; }
這樣在涉及到多張表*1000條數據,那麼會不會有很大的延時呢?
結果是的,她這樣寫確實是導致了伺服器的超時!
大家如果熟悉JAVA等語言應該知道,JAVA會內部提供了批量更新sql的功能,那麼作為世界上做好的語言PHP能不能做到呢?答案是可以滴!
那麼我們學習一下批次更新的sql語句。
UPDATE newhouse_clicks SET clicks = CASE id WHEN 1 THEN 1000 WHEN 2 THEN 2000 WHEN 3 THEN 3000 END WHERE id IN (1,2,3)
稍微安勿躁,咱們詳解一下這條sql語句的意思:
更新newhouse_clicks資料表中的clicks字段,當id=1是設定值為1000,當id=2時設置值為2000,當id=3時設定值為3000
那麼更新多個欄位能不能做到呢?當然可以,貼程式碼:
UPDATE newhouse_clicks SET clicks = CASE id WHEN 1 THEN 1000 WHEN 2 THEN 2000 WHEN 3 THEN 3000 END, type = CASE id WHEN 1 THEN 1 WHEN 2 THEN 6 WHEN 3 THEN 8 END WHERE id IN (1,2,3)
這條sql語句的意思就是更新newhouse_clicks資料表中的clicks字段,當id=1是設定值為1000,當id=2時設定值為2000,當id=3時設定值為3000,更新type字段,當id=1時更新為type字段為1,當id=2時更新type字段為6,當id=3時,更新type字段為8。
那麼,世界上最好的語言PHP不就可以拼出來sql了嗎?
//查询数据库返回的数据格式 $newhouse_clicks = array( => 2, => 3, => 8, => 9, ); $ids = implode(',', array_keys($newhouse_clicks )); $sql = "UPDATE newhouse_clicks SET clicks = CASE id "; foreach ( $newhouse_clicks as $key => $value) { $sql .= sprintf("WHEN %d THEN %d ", $key, $value); } $sql .= "END WHERE id IN ($ids)"; echo $sql;
大家查看一下是不是跟咱們上面的sql語句是一樣的呀!
那麼,咱們真是的數據是不是要比這複雜呀?肯定的,看題,咱們通常在資料庫裡面取出的資料格式是不是都是這樣的。
//查询数据库返回的数据格式 $newhouse_clicks = array( => array('clicks'=>1,'type'=>1,'update_time'=>time()), => array('clicks'=>2,'type'=>2,'update_time'=>time()), => array('clicks'=>3,'type'=>3,'update_time'=>time()), => array('clicks'=>4,'type'=>4,'update_time'=>time()), ); ?>
那麼,這種情況怎麼辦?
da39b25861c68baa73de965ae2d0e688 array('clicks'=>1,'type'=>1,'update_time'=>time()), => array('clicks'=>2,'type'=>2,'update_time'=>time()), => array('clicks'=>3,'type'=>3,'update_time'=>time()), => array('clicks'=>4,'type'=>4,'update_time'=>time()), ); //获取所有的id $newhouse_clicks_keys = array_keys($newhouse_clicks); //拼接批量更新sql语句 $sql = "UPDATE newhouse_clicks SET "; //合成sql语句 foreach ($newhouse_clicks[1] as $key => $value) { $sql .= "{$key} = CASE id "; foreach ($newhouse_clicks as $newhouse_clicks_key=>$newhouse_clicks_value) { $sql .= sprintf("WHEN %d THEN %d ", $newhouse_clicks_key, $newhouse_clicks_value[$key]); } $sql .= "END, "; } //把最后一个,去掉 $sql = substr($sql, 0, strrpos($sql,',')); //合并所有id $ids = implode(',', $newhouse_clicks_keys); //拼接sql $sql .= " WHERE ID IN ({$ids})"; echo $sql;
其實,寫了這麼一大堆,是不是就是為了拼成mysql語句呀。
大功告成!速度是不是像絲般順滑!
老多程式設計師特別是初學者,很容易進入一個迷思,把在sql中取資料套在for循環裡面。這樣寫導致一個問題,就是嚴重的阻塞,現實生活中就有這樣一個例子:
例如說,你在12層辦公,這是快遞員給你打電話讓你去樓下取快遞(總共12件),你去取快遞有兩種方式:
1.拿到第一件快遞,跑回12層,放好後,接著去領取下一件快遞,放好12層後再接著去取下一件快遞。
2.一次拿所有的快遞拿到12層。
大家一定都會選第二個方案吧,沒人會傻不拉幾的去跑12次才能拿完快遞的。
計算機就是上述原理,在for循環裡面去資源取數據,就是類似第一種方案。批量取資料就是類似第二種方案。 (PS一下:不要以為在mysql中取數據有這種問題,redis也會
有這種問題,要不然怎麼會有pipeline取批量數據呢,這一點在面試的時候我是經常當面試題目去問的,絕對會成為衡量一個人技術水平的標準)
相關推薦:
php中mvc原理是什麼? php的mvc實作原理的介紹(附程式碼)
#以上是PHP中如何實作批次更新mysql中的數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!