PHP中如何?批次更新mysql中的資料

來源:互聯網
上載者:User
本篇文章給大家分享的內容是關於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    ENDWHERE 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    ENDWHERE 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()),);?>

那麼,這種情況怎麼辦?

<?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語句呀。

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

老多程式員特別是初學者,很容易進入一個誤區,把在sql中取資料套在for迴圈裡面。這樣寫導致一個問題,就是嚴重的阻塞,現實生活中就有這樣一個例子:

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

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

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

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

電腦就是上述原理,在for迴圈裡面去資源取資料,就是類似第一種方案。批量取資料就是類似於第二種方案。(PS一下:不要以為在mysql中取資料有這種問題,redis也會

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.