Insertion de plusieurs lignes dans mysql

349

La requête de base de données est-elle plus rapide si j'insère plusieurs lignes à la fois:

comme

INSERT....

UNION

INSERT....

UNION

(Je dois insérer comme 2-3000 lignes)

Emma
la source
8
UNION est pour les selects.
Jacob
1
Comment viennent les rangées? Ecrivez-vous directement SQL sur le navigateur de requêtes MySQL ou utilisez-vous de l'intérieur de PHP ou C # ou autre chose. Si vous vous situez dans ce dernier cas, vérifiez les liens suivants: Le moyen le plus rapide d'insérer des enregistrements rapides de
RKh
Correction du deuxième lien: Optimiser les requêtes MySQL - Insertions rapides avec plusieurs lignes
Pavel Shkleinik

Réponses:

1176

INSERTles instructions qui utilisent la VALUESsyntaxe peuvent insérer plusieurs lignes. Pour ce faire, incluez plusieurs listes de valeurs de colonne, chacune placée entre parenthèses et séparée par des virgules.

Exemple:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

La source

Nicola Cossu
la source
@RPK. Je suis d'accord avec toi mais je ne connais pas sa source de données. Comme je l'ai déjà écrit, si elle a un fichier, j'utiliserais la syntaxe de chargement des données comme le suggère cularis. :)
Nicola Cossu
il est également possible d'utiliser INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. bien sûr, ce ne sera que mieux si les valeurs insérées proviennent de différentes tables.
Zohar Peled
72
Référence utile, car parfois j'oublie simplement la syntaxe simple.
Captain Hypertext
est-ce que a, b et c sont des variables temporaires stockant le contenu des lignes?
Lealo
3
@Lealo non, ce sont les noms de colonnes de table dans lesquels insérer les valeurs dans le même ordre.
BeetleJuice
60

Si vous avez vos données dans un fichier texte, vous pouvez utiliser LOAD DATA INFILE .

Lors du chargement d'une table à partir d'un fichier texte, utilisez LOAD DATA INFILE. Ceci est généralement 20 fois plus rapide que l'utilisation d'instructions INSERT.

Optimisation des instructions INSERT

Vous pouvez trouver plus de conseils sur la façon d'accélérer vos instructions d'insertion sur le lien ci-dessus.

Jacob
la source
3
Qu'en est-il des enregistrements en double?
Matteo
2
@Matteo Duplicates sera inséré ou rejeté par la base de données en fonction du schéma que vous avez défini.
ankush981
Utilisez mysql multiqueries
Francisco Yepes Barrera
1
Deuxième lien 404.
dimir
1
Le lien brisé "Instructions d'insertion de vitesse" est maintenant couvert dans: Optimisation des instructions INSERT .
Kenneth M. Kolano
27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;
sunilsingh
la source
3
Cela mérite plus de votes positifs, en utilisant cela, vous pouvez insérer en masse des données récupérées à partir d'autres tables
Novastorm
4
Si seulement il y avait une explication sur ce qui se passe dans ce morceau de code, étant donné que je dois "insérer en masse des données récupérées à partir d'autres tables" ...
Aleister Tanek Javas Mraz
0

Voici une solution PHP prête à l'emploi avec une table: m (relation plusieurs-à-plusieurs):

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));
Meloman
la source
L'utilisation de l'implode () contourne le problème du "dernier caractère" mais crée une énorme surcharge de mémoire. Elle a demandé 3000 lignes, imaginez que chaque ligne a 1 Ko de données, c'est déjà 3 Mo de données brutes. La baie prendra 30 Mo de mémoire, elle consomme déjà 30 Mo supplémentaires à partir de $ table_1, de sorte que le script utiliserait 60 Mo. Je dis juste, sinon c'est une bonne solution
John
c'est utile pour ma situation.
Bilal Şimşek
-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";
Johirulla
la source
Outre la confusion de cette réponse, vous pouvez également être vulnérable à l'injection SQL, en supposant que vous utilisez PHP.
ultrafez
2
1. Il y a un bug dans votre code SQL. 2. La valeur $ sql suivante remplacera la valeur $ sql précédente.
Marwan Salim