MySQL: quante righe posso inserire in una singola istruzione INSERT?


91

Dipende dal numero di insiemi di valori? Dipende dal numero di byte nell'istruzione INSERT?

Risposte:


93

È possibile inserire un numero infinito di record utilizzando INSERT ... SELECTpattern, a condizione di disporre di tali record o di una parte di essi in altre tabelle.

Ma se stai codificando i valori usando INSERT ... VALUESpattern, allora c'è un limite su quanto è grande / lunga la tua istruzione: max_allowed_packet che limita la lunghezza delle istruzioni SQL inviate dal client al server database e influisce su qualsiasi tipo di query e non solo per l'istruzione INSERT.


44

Idealmente, Mysql consente la creazione di un numero infinito di righe in un singolo inserimento (contemporaneamente) ma quando un file

Il client MySQL o il server mysqld riceve un pacchetto più grande di max_allowed_packet byte, emette un errore di pacchetto troppo grande e chiude la connessione.

Per visualizzare qual è il valore predefinito per la variabile max_allowed_packet, eseguire il seguente comando in MySQL:

show variables like 'max_allowed_packet';

L'installazione standard di MySQL ha un valore predefinito di 1048576 byte (1 MB). Questo può essere aumentato impostandolo su un valore più alto per una sessione o una connessione.

Questo imposta il valore a 500 MB per tutti (questo è ciò che significa GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

controlla la modifica nel nuovo terminale con una nuova connessione:

show variables like 'max_allowed_packet';

Ora dovrebbe funzionare senza errori per l'inserimento di record infiniti. Grazie


11
500 MB non sono infiniti. È molto più grande del valore predefinito, ma comunque non infinito.
Carlos2W

Una domanda: a cosa serve esattamente questo limite? La query stessa? E i dati, bind durante l'esecuzione dell'istruzione? Posso essere al sicuro, fino a quando strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat

Se stavi cercando di impostarlo sul valore più grande possibile, cioè 1 GB che sarebbe simile a questo: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



6

È possibile inserire un numero infinito di righe con un'istruzione INSERT. Ad esempio, è possibile eseguire una stored procedure che dispone di un ciclo eseguito migliaia di volte, ogni volta che esegue una query INSERT.

Oppure il tuo INSERT potrebbe far scattare un trigger che esegue esso stesso un INSERT. Che fa scattare un altro trigger. E così via.

No, non dipende dal numero di insiemi di valori. Né dipende dal numero di byte.

C'è un limite a quanto profondamente possono essere annidate le parentesi e un limite alla lunghezza della tua dichiarazione totale. Entrambi sono citati, ironicamente, su thedailywtf.com. Tuttavia, entrambi i mezzi che ho menzionato sopra aggirano questi limiti.


I suoi esempi sono per l'esecuzione di inserire più, e non mostra sull'inserimento di più righe in un INSERT ..
Lukman

@Lukman: una query INSERT può comportare che più INSERTI raggiungano il database. È solo questione di chi conta cosa.
Borealid

2
vero, ma il tuo primo esempio mostra l'esecuzione di query in un ciclo con ogni ciclo che esegue un'istruzione INSERT e non dice nulla su quell'unica istruzione INSERT che inserisce più righe. è solo una questione di enfasi.
Lukman

Nessuno può fare infinite cose. Ci sono sempre limiti di risorse.
Adrien

Questo si applica anche all'istruzione SELECT ... FROM? Voglio dire, se i dati sono stati inseriti in primo luogo con max_allowed_packet, non dovrebbe essere selezionato anche dopo ?. Non capisco perché sia ​​applicato a tutte le altre affermazioni come ha detto l'altro poster quando deve essere inserito prima di ogni altra cosa comunque.
Thielicious


2

Credo che non ci sia un numero definito di righe che sei limitato all'inserimento per INSERT, ma potrebbe esserci una sorta di dimensione massima per le query in generale.


2

È limitato da max_allowed_packet.
È possibile specificare utilizzando: mysqld --max_allowed_packet=32M È per impostazione predefinita 16M.
Puoi anche specificare in my.cnf in / etc / mysql /

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.