MySQL - combien de lignes puis-je insérer dans une seule instruction INSERT?


91

Cela dépend-il du nombre d'ensembles de valeurs? Cela dépend-il du nombre d'octets dans l'instruction INSERT?

Réponses:


93

Vous pouvez insérer un nombre infiniment grand d'enregistrements à l'aide d'un INSERT ... SELECTmodèle, à condition que vous ayez ces enregistrements, ou une partie de, dans d'autres tables.

Mais si vous codez en dur les valeurs à l'aide de INSERT ... VALUESpattern, il y a une limite sur la taille / la longueur de votre instruction: max_allowed_packet qui limite la longueur des instructions SQL envoyées par le client au serveur de base de données et affecte tous les types de requêtes et pas seulement pour l'instruction INSERT.


44

Idéalement, Mysql permet la création d'un nombre infini de lignes en un seul insert (à la fois) mais quand un

Le client MySQL ou le serveur mysqld reçoit un paquet plus grand que max_allowed_packet octets, il émet une erreur Packet too large et ferme la connexion.

Pour afficher la valeur par défaut de la variable max_allowed_packet, exécutez la commande suivante dans MySQL:

show variables like 'max_allowed_packet';

L'installation standard de MySQL a une valeur par défaut de 1048576 octets (1 Mo). Cela peut être augmenté en le définissant sur une valeur plus élevée pour une session ou une connexion.

Cela définit la valeur à 500 Mo pour tout le monde (c'est ce que signifie GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

vérifiez votre changement dans un nouveau terminal avec une nouvelle connexion:

show variables like 'max_allowed_packet';

Maintenant, cela devrait fonctionner sans aucune erreur pour l'insertion d'enregistrements infinis. Merci


11
500 Mo n'est pas infini. C'est beaucoup plus grand que la valeur par défaut, mais toujours pas infini.
Carlos2W

Une question: à quoi sert exactement cette limite? La requête elle-même? Qu'en est-il des données, lier lors de l'exécution de l'instruction? Puis-je être en sécurité jusqu'à ce que strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat

Si vous essayiez de le définir sur la plus grande valeur possible, soit 1 Go, ce qui ressemblerait à ceci: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru



6

Vous pouvez insérer un nombre infini de lignes avec une instruction INSERT. Par exemple, vous pouvez exécuter une procédure stockée dont une boucle est exécutée mille fois, chaque fois en exécutant une requête INSERT.

Ou votre INSERT pourrait déclencher un déclencheur qui effectue lui-même un INSERT. Ce qui déclenche un autre déclencheur. Etc.

Non, cela ne dépend pas du nombre de jeux de valeurs. Cela ne dépend pas non plus du nombre d'octets.

Il y a une limite à la profondeur d'imbrication de vos parenthèses et une limite à la longueur de votre déclaration totale. Les deux sont référencés, ironiquement, sur thedailywtf.com. Cependant, les deux moyens que j'ai mentionnés ci-dessus contournent ces limites.


Vos exemples concernent l'exécution de plusieurs INSERT et ne montrent pas l'insertion de plusieurs lignes dans une instruction INSERT.
Lukman

@Lukman: Une requête INSERT peut entraîner plusieurs INSERTS atteignant la base de données. C'est juste une question de qui compte quoi.
Borealid

2
c'est vrai, mais votre premier exemple montre comment exécuter une requête dans une boucle avec chaque boucle exécutant une instruction INSERT, et il ne dit rien sur cette instruction INSERT insérant plusieurs lignes. c'est juste une question d'accent.
Lukman

Personne ne peut rien faire à l'infini. Il y a toujours des limites de ressources.
Adrien

Cela s'applique-t-il également à l'instruction SELECT ... FROM? Je veux dire que si des données ont été insérées en premier lieu avec max_allowed_packet, cela ne devrait-il pas être sélectionné après cela aussi ?. Je ne comprends pas pourquoi il est appliqué à toutes les autres déclarations, comme l'a dit l'autre affiche quand il doit d'abord être inséré avant toute autre chose de toute façon.
Thielicious


2

Je crois qu'il n'y a pas de nombre défini de lignes que vous êtes limité à insérer par INSERT, mais il peut y avoir une sorte de taille maximale pour les requêtes en général.


2

Il est limité par max_allowed_packet.
Vous pouvez spécifier en utilisant: mysqld --max_allowed_packet=32M Il est par défaut 16M.
Vous pouvez également spécifier dans my.cnf dans / etc / mysql /

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.