Maison >développement back-end >tutoriel php >Comment résoudre le problème de l'enregistrement simultané d'une grande quantité de données dans la base de données en PHP
Les insertions de base de données peuvent être mises à jour par lots. Lorsqu'une grande quantité de données est insérée de manière cyclique, les données peuvent être conservées sans exécuter la commande d'insertion et le dernier élément peut être inséré en une seule fois, comme la méthode addAll(). de tp;
La mise à jour de la base de données peut également être mise à jour par lots si le cas échéant est utilisé. J'ai trouvé une méthode saveAll() basée sur tp sur Baidu, qui est utilisée pour mettre à jour les données
Cet article. parle principalement de l'insertion par lots ;
Exemple :
Générer une commande
L'instruction normale est :
INSERT INTO order (`goods_id`,`num`,`price`) VALUES (1,1,'10.00'); //封装成函数 function add_order($goods_id,$num,$price){ $db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)"); }
Supposons qu'il y ait un utilisateur qui place 1 000 articles dans le panier en même temps Lorsque le produit est réglé dans une commande et que 1 000 commandes sont générées
for ($i=0;$i<1000;$i++){ $db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)"); } //这样的话会导致服务器资源占用过大,网站卡死 //所以,我们可以 $sql = "INSERT INTO order (`goods_id`,`num`,`price`) VALUES "; for ($i=0;$i<1000;$i++){ if($i==0){ $sql.="($goods_id,$num,$price)"; }else{ $sql.=",($goods_id,$num,$price)"; } } $db->query($sql);
C'est un peu plus compliqué de mettre en œuvre la mise à jour par lots, donc je ne le ferai pas. envoyez-le. Ce qui suit est l'instruction d'exécution SQL pour la mise à jour par lots
UPDATE tiyan.dm_user_cupboard SET `res_id` = CASE `id` WHEN 1041 THEN '1' WHEN 1058 THEN '1' WHEN 1055 THEN '1'. END,`food_code` = CASE `id` QUAND 1041 PUIS '68' QUAND 1058 PUIS '47' QUAND 1055 PUIS '49' END,`food_name` = CASE `id` QUAND 1041 PUIS 'Dates rouges' QUAND 1058 PUIS 'Lotus root' QUAND 1055 PUIS 'Oignon' FIN,`num` = CASE `id` QUAND 1041 PUIS '2' QUAND 1058 PUIS '3' QUAND 1055 PUIS '2' FIN,`level` = CASE `id` QUAND 1041 ALORS ' 2' QUAND 1058 PUIS '2' QUAND 1055 PUIS '2' END,`update_time` = CASE `id` QUAND 1041 PUIS '2017-12-09 21:40:06' QUAND 1058 PUIS '2017-12-09 21 : 40:06' WHEN 1055 THEN '2017-12-09 21:40:06' END WHERE id IN ( 1041,1058,1055 )
Livré avec saveAll() basé sur tp
//批量更新 public function saveAll($datas,$model){ ( $model || $model=$this->tableName); $model=empty($model)?$this->name:$model; $sql = ''; //Sql $lists = []; //记录集$lists $pk = $this->getPk();//获取主键 foreach ($datas as $data) { foreach ($data as $key=>$value) { if($pk===$key){ $ids[]=$value; }else{ $lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value); } } } foreach ($lists as $key => $value) { $sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value); } $sql = sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($model),rtrim($sql,','),$pk,implode(',',$ids)); return M()->execute($sql); }
Recommandations associées :
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!