web-dev-qa-db-fra.com

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

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

80
Luistar15

Vous pouvez insérer un nombre infini d'enregistrements à l'aide de INSERT ... SELECT pattern, à condition que vous ayez ces enregistrements, ou une partie de ceux-ci, dans d'autres tables.

Mais si vous codez en dur les valeurs en utilisant INSERT ... VALUES pattern, il existe une limite à 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 tous types de requêtes. non seulement pour l'instruction INSERT.

88
Lukman

Dans l’idéal, Mysql autorise la création d’un nombre infini de lignes dans une seule insertion (en une fois), mais lorsqu’un

Le client MySQL ou le serveur mysqld reçoit un paquet plus grand que max_allowed_packet octets, il génère 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 1048 576 octets (1 Mo). Cela peut être augmenté en lui attribuant une valeur plus élevée pour une session ou une connexion.

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

SET GLOBAL max_allowed_packet=524288000;

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

show variables like 'max_allowed_packet';

Maintenant, cela devrait fonctionner sans erreur pour les enregistrements infinis. Merci

35
Raju akula

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

20

reportez-vous à http://forums.mysql.com/read.php?20,161869 , il est lié à la configuration de votre mysql: max_allowed_packet, bulk_insert_buffer_size, key_buffer_size.

8
clark yu

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

Ou bien votre INSERT peut 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 existe une limite à la profondeur d'imbrication de vos parenthèses et à la longueur de votre déclaration totale. Ironiquement, ces deux éléments sont référencés sur thedailywtf.com. Cependant, les deux moyens que j'ai mentionnés ci-dessus contournent ces limites.

5
Borealid

Vous atteindrez la limite max_allowed_packet et

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

Vous pouvez placer 65535 espaces réservés dans un sql.Ainsi, si vous avez deux colonnes dans une ligne, vous pouvez insérer 32767 lignes dans un même sql.

L'importation d'enregistrements de 50 Ko + dans MySQL génère une erreur générale: 1390 L'instruction préparée contient trop d'espaces réservés

3
bronze man

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 /

1
linehrr

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.

1
DMags