国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

PHP中如何實現批量更新mysql中的數據

2020-03-22 19:50:33
字體:
來源:轉載
供稿:網友
本篇文章給大家分享的內容是關于PHP如何批量更新MYSQL中的數據,內容很詳細,有需要的朋友可以參考一下,希望可以幫助到你們。

在這個業(yè)務里里面涉及到了更新兩張數據表,那么大家是不是會想到非常簡單,馬上上代碼

$sql = update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$html' target='_blank'>value[ id ] 

其中數據表名為newhouse_clicks,有四個字段,主鍵id,type(類型-整型)字段,clicks(點擊量-整型)字段,update_time(整型)字段
這樣做確實沒有問題嗎?比如說批量更新當前城市下的所有樓盤,比如說北京,打個比方1000條數據,那么在業(yè)務里面是不是就要這樣寫

$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 3000WHERE 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 8WHERE 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($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()),? 

那么,這種情況怎么辦?

 ?php//查詢數據庫返回的數據格式$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()), //獲取所有的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語句呀。

大功告成!速度是不是像絲般順滑!

老多程序員特別是初學者,很容易進入一個誤區(qū),把在sql中取數據套在for循環(huán)里面。這樣寫導致一個問題,就是嚴重的阻塞,現實生活中就有這樣一個例子:

比如說,你在12層辦公,這是快遞員給你打電話讓你去樓下取快遞(總共12件),你去取快遞有兩種方式:

1.拿到第一件快遞,跑回12層,放好后,接著去領取下一件快遞,放好12層后再接著去取下一件快遞。

2.一次性把所有的快遞都拿到12層。

大家一定都會選第二個方案吧,沒人會傻不拉幾的去跑12次才能拿完快遞的。

計算機就是上述原理,在for循環(huán)里面去資源取數據,就是類似第一種方案。批量取數據就是類似于第二種方案。(PS一下:不要以為在mysql中取數據有這種問題,redis也會

有這種問題,要不然怎么會有pipeline取批量數據呢,這一點在面試的時候我是經常當面試題去問的,絕對會成為衡量一個人技術水平的標準)

相關推薦:

php中mvc原理是什么?php的mvc實現原理的介紹(附代碼)

PHP如何上傳文件到七牛的方法代碼

以上就是PHP中如何實現批量更新mysql中的數據的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阜平县| 万源市| 安溪县| 济南市| 梁平县| 永昌县| 仙游县| 百色市| 汽车| 托克托县| 秭归县| 广水市| 浦东新区| 岢岚县| 桂阳县| 大足县| 库尔勒市| 伊通| 凤城市| 吉安市| 罗山县| 左权县| 三都| 柳河县| 泸西县| 鹰潭市| 图片| 涿鹿县| 娱乐| 华坪县| 汨罗市| 唐山市| 龙胜| 盱眙县| 衡南县| 榆林市| 山阳县| 安平县| 赤水市| 米脂县| 宝兴县|