Inserimento di più righe in mysql


349

La query del database è più veloce se inserisco più righe contemporaneamente:

piace

INSERT....

UNION

INSERT....

UNION

(Ho bisogno di inserire come 2-3000 righe)


8
UNION è per le selezioni.
Jacob,

1
Come stanno arrivando le file? Stai scrivendo direttamente SQL su MySQL Query Browser o usando da PHP o C # o qualcos'altro. Se ti trovi in ​​quest'ultimo caso, controlla i seguenti collegamenti: Il modo più veloce per inserire record da 100k Inserimenti rapidi con più righe
RKh

Secondo link fisso: Ottimizza le query MySQL
Inserimenti

Risposte:


1176

INSERTle istruzioni che utilizzano la VALUESsintassi possono inserire più righe. Per fare ciò, includere più elenchi di valori di colonna, ciascuno racchiuso tra parentesi e separato da virgole.

Esempio:

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

fonte


@RPK. Sono d'accordo con te ma non conosco la sua fonte di dati. Come ho già scritto, se avesse un file, userei la sintassi dei dati di caricamento come suggerisce Cularis. :)
Nicola Cossu,

è anche possibile usare INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. ovviamente, sarà solo meglio se i valori inseriti provengono da tabelle diverse.
Zohar Peled,

72
Riferimento utile, perché a volte dimentico semplicemente la sintassi semplice.
Capitano Hypertext

qui a, bec sono variabili temporanee che memorizzano il contenuto delle righe?
Lealo,

3
@Lealo no, sono i nomi delle colonne della tabella in cui inserire i valori nello stesso ordine.
BeetleJuice,

60

Se hai i tuoi dati in un file di testo, puoi usare LOAD DATA INFILE .

Quando si carica una tabella da un file di testo, utilizzare LOAD DATA INFILE. Questo è di solito 20 volte più veloce rispetto all'uso delle istruzioni INSERT.

Ottimizzazione delle istruzioni INSERT

Puoi trovare altri suggerimenti su come velocizzare le tue istruzioni di inserimento sul link sopra.


3
Che dire dei record duplicati?
Matteo,

2
I duplicati di @Matteo verranno inseriti o rifiutati dal database in base allo schema che hai definito.
ankush981,

Usa mysql multiquery
Francisco Yepes Barrera

1
Secondo collegamento 404.
Dimir,

1
Il collegamento interrotto " Istruzioni Speed ​​of Insert" è ora trattato in: Ottimizzazione delle istruzioni 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;

3
Questo merita più voti, usando questo puoi inserire in blocco i dati recuperati da altre tabelle
Novastorm,

4
Se solo ci fosse una spiegazione di ciò che sta accadendo in questo pezzo di codice, dato che devo "inserire in
blocco i

0

Ecco una soluzione PHP pronta per l'uso con una tabella: m (relazione molti-a-molti):

// 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));

L'uso di implode () elude il problema dell '"ultimo carattere" ma crea un enorme sovraccarico di memoria. Ha chiesto 3000 righe, immagina che ogni riga abbia 1kb di dati, che sono già 3 MB di dati non elaborati. L'array occuperà 30 MB di memoria che consuma già altri 30 MB da $ table_1 in modo che lo script utilizzi 60 MB. Dico solo, altrimenti è una buona soluzione
John,

è utile per la mia situazione.
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')";

A parte la confusione di questa risposta, potresti anche essere vulnerabile all'iniezione di SQL, supponendo che stai usando PHP.
ultrafez,

2
1. C'è un bug nel tuo codice SQL. 2. Il prossimo valore $ sql sostituirà il precedente valore $ sql.
Marwan Salim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.