Le contenu de cet article explique comment PHP met à jour les données dans MYSQL par lots. Le contenu est très détaillé. Les amis dans le besoin peuvent s'y référer. J'espère qu'il pourra vous aider.
Dans ce métier, cela implique de mettre à jour deux tables de données. Vous penserez donc que c'est très simple. Il suffit de télécharger le code immédiatement
$sql = "update newhouse_clicks set clicks=6,type=1,update_time=time() where is=$value['id']";
Parmi elles, la table de données s'appelle newhouse_clicks. , et il y a quatre champs, l'identifiant de clé primaire, le champ type (type - entier), le champ clics (clics - entier), le champ update_time (entier)
Il n'y a vraiment aucun problème avec cela ? Par exemple, si vous souhaitez mettre à jour par lots toutes les propriétés immobilières de la ville actuelle, comme Pékin, par exemple, s'il y a 1 000 données, alors dans l'entreprise, devriez-vous écrire comme ceci
$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']"; }
Cela impliquera plusieurs tables * 1000 S'il y a une donnée, y aura-t-il un gros retard ?
Le résultat est oui, son écriture comme celle-ci a provoqué un timeout du serveur !
Si vous êtes familier avec des langagestels que JAVA, sachez que JAVA fournit la fonction de mise à jour par lots de SQL en interne. Alors, en tant que meilleur langage au monde, PHP peut-il le faire ? La réponse est oui !
Apprenons ensuite l'instruction SQL pour la mise à jour par lots.
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)
Soyez patient, expliquons en détail la signification de cette instruction SQL :
Mettez à jour le champ clicks dans la table de données newhouse_clicks. Lorsque id=1, la valeur est définie sur 1000, lorsque id. =2 Lorsque la valeur est définie sur 2000, lorsque id=3, la valeur est définie sur 3000
Alors est-il possible de mettre à jour plusieurs champs ? Bien sûr, vous pouvez poster le code :
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)
La signification de cette instruction SQL est de mettre à jour le champ clicks dans la table de données newhouse_clicks. Lorsque id=1, la valeur est définie sur 1000, et lorsque. id=2, la valeur est définie sur 2000. , lorsque id=3, définissez la valeur sur 3000, mettez à jour le champ de type, lorsque id=1, mettez à jour le champ de type sur 1, lorsque id=2, mettez à jour le champ de type sur 6, lorsque id=3, mettez à jour le champ type à 8.
Alors, PHP, le meilleur langage du monde, ne peut-il pas épeler 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;
Veuillez vérifier si c'est la même chose que notre instruction SQL ci-dessus !
Alors, nos données réelles sont-elles plus compliquées que cela ? Bien sûr, selon la question, le format des données que nous extrayons habituellement de la base de données est-il comme celui-ci ?
//查询数据库返回的数据格式 $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()), ); ?>
Alors, que devons-nous faire dans cette situation ?
<?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;
En fait, j'ai écrit tellement de mots juste pour les assembler dans des instructions MySQL.
Fait ! La vitesse n'est-elle pas aussi douce que la soie !
De nombreux programmeurs, en particulier les débutants, peuvent facilement tomber dans un malentendu et placer la récupération de données en SQL dans une boucle for. Écrire ainsi entraîne un problème, qui est un grave encombrement. Il existe un tel exemple dans la vraie vie :
Par exemple, vous travaillez au 12ème étage et le coursier vous appelle et vous demande de descendre. pour récupérer l'express. (12 pièces au total), vous avez deux façons de récupérer l'express :
1. Prenez le premier express, retournez au 12ème étage, rangez-le, puis partez et récupérez le prochain express, rangez-le 12 Après la superposition, continuez à récupérer un morceau de livraison express.
2. Prenez toute la livraison express au 12ème étage en même temps.
Tout le monde choisira certainement la deuxième option. Personne ne sera assez stupide pour courir 12 fois pour obtenir la livraison express.
L'ordinateur est basé sur le principe ci-dessus. Récupérer des données à partir de ressources dans une boucle for est similaire à la première solution. La récupération de données par lots est similaire à la deuxième solution. (PS : ne pensez pas que la récupération de données dans MySQL pose ce genre de problème. Redis aura également
ce genre de problème. Sinon, comment pourrait-il y avoir un pipeline pour récupérer les données par lots ? C'est quelque chose que je fait souvent lors des entretiens. Lorsqu'on lui pose une question lors d'un entretien, cela deviendra certainement une norme pour mesurer le niveau technique d'une personne)
Recommandations associées :
Comment télécharger des fichiers sur Qiniu dans le code de la méthode PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!