Maison > base de données > tutoriel mysql > le corps du texte

Comment insérer des données par lots dans MySQL

coldplay.xixi
Libérer: 2023-01-04 09:37:18
original
34034 Les gens l'ont consulté

Méthode d'insertion de données par lots MySQL : 1. Insertion de boucle, format de syntaxe "for($i=1;$i<=condition;$i++){//insert déclaration}" 2. Réduire les ressources de connexion, épisser un SQL ; 3. Utiliser des procédures stockées ; 4. Utiliser "MYSQL LOCAL_INFILE".

Comment insérer des données par lots dans MySQL

L'environnement d'exploitation de ce tutoriel : système Windows7, mysql version 8.0.22, ordinateur thinkpad t480.

Méthode d'insertion de données par lots MySQL :

Méthode 1 : Insertion de boucle

C'est également la méthode la plus courante, si La quantité de données n'est pas très importante et peut être utilisée, mais les ressources pour se connecter à la base de données seront consommées à chaque fois.

L'idée générale est la suivante

(J'écris du pseudo code ici, l'écriture spécifique peut être combinée avec votre propre logique métier ou syntaxe de framework)

for($i=1;$i<=100;$i++){
$sql = &#39;insert...............&#39;;
//querysql
}
foreach($arr as $key => $value){
$sql = &#39;insert...............&#39;;
//querysql
}
while($i <= 100){
$sql = &#39;insert...............&#39;;
//querysql
$i++
}
Copier après la connexion

Parce que c'est trop courant et pas difficile à la fois. En même temps, ce n'est pas ce que j'écris principalement aujourd'hui, donc je ne dirai pas grand chose ici

Méthode 2 : Réduire les ressources de connexion et épisser un sql

Le pseudo code est le suivant

//这里假设arr的key和数据库字段同步,其实大多数框架中在php操作数据库的时候都是这么设计的
$arr_keys        = array_keys($arr);
$sql             = &#39;INSERT INTO tablename (&#39; . implode(&#39;,&#39; ,$arr_keys) . &#39;) values&#39;;
$arr_values      = array_values($arr);
$sql             .= " (&#39;" . implode("&#39;,&#39;" ,$arr_values) . "&#39;),";
$sql             = substr($sql ,0 ,-1);
//拼接之后大概就是  INSERT INTO tablename (&#39;username&#39;,&#39;password&#39;) values 
(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;),(&#39;xxx&#39;,&#39;xxx&#39;)
.......
//querysql
Copier après la connexion

Ce n'est pas un gros problème d'insérer 10 000 éléments normalement s'ils sont écrits comme ça. À moins que les données ne soient très longues, il suffit de le faire. gérer l'insertion par lots ordinaire, telle que : la génération par lots de numéros de carte, la génération par lots de codes aléatoires, etc.

Méthode 3 : Utiliser des procédures stockées

Il se trouve que je l'utilise à nouveau et que je paie simplement le SQL. Vous pouvez combiner vous-même la logique métier spécifique.

delimiter $$$
create procedure zqtest()
begin
declare i int default 0;
set i=0;
start transaction;
while i<80000 do
//your insert sql 
set i=i+1;
end while;
commit;
end
$$$
delimiter;
call zqtest();
Copier après la connexion

Ceci n'est qu'un code de test. Vous pouvez définir vous-même les paramètres spécifiques

J'insère 80 000 éléments à la fois, bien que ce ne soit pas beaucoup, la quantité de données dans chaque pièce. est grand, et il y a beaucoup de varchar4000 et de champs de texte

prend 6,524 s

Méthode 4 : utiliser MYSQL LOCAL_INFILE

C'est ce que je suis actuellement en utilisant, donc au fait, j'ai aussi mis le code pdo Postez-le pour votre référence

//设置pdo开启MYSQL_ATTR_LOCAL_INFILE
/*hs96.cn@gmail.com
public function pdo_local_info ()
{
     global $system_dbserver;
     $dbname  = &#39;hs96.cn@gmail.com&#39;;
     $ip      = &#39;hs96.cn@gmail.com&#39;;
     $user    = &#39;hs96.cn@gmail.com&#39;;
     $pwd     = &#39;hs96.cn@gmail.com&#39;;
     $dsn     = &#39;mysql:dbname=&#39; . $dbname . &#39;;host=&#39; . $ip . &#39;;port=3306&#39;;
     $options = [PDO::MYSQL_ATTR_LOCAL_INFILE => true];
     $db      = new PDO($dsn ,$user ,$pwd ,$options);
     return $db;
 }
//伪代码如下
public function test(){
     $arr_keys         = array_keys($arr);
$root_dir         = $_SERVER["DOCUMENT_ROOT"] . &#39;/&#39;;
$my_file          = $root_dir . "hs96.cn@gmail.com/sql_cache/" . $order[&#39;OrderNo&#39;] . &#39;.sql&#39;;
$fhandler         = fopen($my_file,&#39;a+&#39;);
if ($fhandler) {
    $sql = implode("\t" ,$arr);
      $i   = 1;
      while ($i <= 80000)
      {
          $i++;
          fwrite($fhandler ,$sql . "\r\n");
      }
      $sql = "LOAD DATA local INFILE &#39;" . $myFile . "&#39; INTO TABLE ";
      $sql .= "tablename (" . implode(&#39;,&#39; ,$arr_keys) . ")";
      $pdo = $this->pdo_local_info ();
      $res = $pdo->exec($sql);
      if (!$res) {
           //TODO 插入失败
      }
      @unlink($my_file);
  }
}
Copier après la connexion

Plus de recommandations d'apprentissage gratuites connexes : tutoriel mysql(vidéo)

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal