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?

Luistar15
la source

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.

Lukman
la source
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

Raju Akula
la source
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
23

La requête est limitée par max_allowed_packeten général.

Dmytro Lytovchenko
la source
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.

Boréalide
la source
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
6

Vous atteindrez la limite max_allowed_packet et

erreur: 1390 L'instruction préparée contient trop d'espaces réservés.

Vous pouvez mettre 65535 espaces réservés dans un sql.Si vous avez deux colonnes dans une ligne, vous pouvez insérer 32767 lignes dans un sql.

L'importation de plus de 50 000 enregistrements dans MySQL donne une erreur générale: 1390 L'instruction préparée contient trop d'espaces réservés

homme de bronze
la source
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.

DMags
la source
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 /

linehrr
la source