Maison  >  Article  >  développement back-end  >  Comment implémenter la mise à jour par lots des données dans MySQL en PHP

Comment implémenter la mise à jour par lots des données dans MySQL en PHP

不言
不言original
2018-07-26 11:46:593594parcourir

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 langages​​tels 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 ?

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;

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 :

Quel est le principe du mvc dans php ? Introduction au principe d'implémentation MVC de PHP (avec code)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn