ホームページ >バックエンド開発 >PHPチュートリアル >PHPでmysqlのデータの一括更新を実装する方法
この記事の内容は、PHP が MYSQL のデータをバッチで更新する方法についてです。非常に詳細な内容です。困っている友人は参考にしてください。お役に立てれば幸いです。
このビジネスには 2 つのデータ テーブルの更新が含まれるため、非常に簡単であると考えて、すぐにコードをアップロードします。
$sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";
データ テーブルの名前は newhouse_clicks で、4 つのフィールドがあります。 key id、type (type - integer) フィールド、clicks (clicks - integer) フィールド、update_time (integer) フィールド
これで本当に問題ないでしょうか?たとえば、現在の都市 (北京など) にあるすべての不動産物件を一括更新したい場合、データが 1,000 件ある場合、ビジネスでは次のように記述する必要があります
$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']"; }
これには複数のテーブル * 1,000 個のデータが関係します。その場合、大きな遅延が発生しますか?
結果は「はい」です。彼女がこのように書いたためにサーバーがタイムアウトしてしまいました。
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 データ テーブルのクリック数フィールドを更新します。id=1 の場合、値は 1000 に設定され、id= の場合、値は 1000 に設定されます。 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 データ テーブルのクリック数フィールドを更新することです。id=1 の場合、値は 1000 に設定され、id= の場合、値は 1000 に設定されます。 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 個)、急行を受け取るには 2 つの方法があります:
1. 最初の急行に乗り、走って 12 階まで戻り、それをしまってから、行きます。次の速達を受け取り、片付ける 12 重ね着した後、速達の受け取りに進みます。
2. 速達便を一度に12階までお持ちください。
外出中に出て行ってください - しかし、誰もが間違いなく2番目のオプションを選択します。
コンピューターは上記の原則に基づいており、for ループでリソースからデータを取得することは最初の解決策と似ています。バッチでのデータの取得は 2 番目の解決策と似ています。 (PS: mysql でデータをフェッチするときにそのような問題があるとは考えないでください。Redis
にもこの種の問題が発生します。そうでない場合、どうやってバッチ データをフェッチするパイプラインがあるでしょうか? これは問題です。面接でよくやるのですが、面接で質問されると必ずその人の技術レベルを測る基準になります)
関連おすすめ:
mvcの原理とはphpで? PHP mvc 実装原理の紹介 (コード付き) PHP メソッド コードで Qiniu にファイルをアップロードする方法以上がPHPでmysqlのデータの一括更新を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。