MySQL: ¿cuántas filas puedo insertar en una sola instrucción INSERT?

91

¿Depende del número de conjuntos de valores? ¿Depende del número de bytes en la instrucción INSERT?

Luistar15
fuente

Respuestas:

93

Puede insertar una cantidad infinita de registros utilizando INSERT ... SELECTpatrón, siempre que tenga esos registros, o parte de, en otras tablas.

Pero si está codificando los valores usando un INSERT ... VALUESpatrón, entonces hay un límite en el tamaño / largo de su declaración: max_allowed_packet que limita la longitud de las declaraciones SQL enviadas por el cliente al servidor de la base de datos y afecta cualquier tipo de consulta y no solo para la instrucción INSERT.

Lukman
fuente
44

Idealmente, Mysql permite la creación de un número infinito de filas en una sola inserción (a la vez) pero cuando un

El cliente MySQL o el servidor mysqld recibe un paquete mayor que max_allowed_packet bytes, emite un error de paquete demasiado grande y cierra la conexión.

Para ver cuál es el valor predeterminado para la variable max_allowed_packet, ejecute el siguiente comando en MySQL:

show variables like 'max_allowed_packet';

La instalación estándar de MySQL tiene un valor predeterminado de 1048576 bytes (1 MB). Esto se puede aumentar configurándolo en un valor más alto para una sesión o conexión.

Esto establece el valor en 500 MB para todos (eso es lo que significa GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

verifique su cambio en nuevo terminal con nueva conexión:

show variables like 'max_allowed_packet';

Ahora debería funcionar sin ningún error para insertar registros infinitos. Gracias

Akula Raju
fuente
11
500 MB no es infinito. Es mucho más grande que el valor predeterminado, pero aún así, no es infinito.
Carlos2W
Una pregunta: ¿para qué es exactamente este límite? ¿La consulta en sí? ¿Qué pasa con los datos, se vinculan al ejecutar la declaración? ¿Puedo estar a salvo, hasta strlen($query_with_questionmarks) < $max_alloweed_packet?
Pilat
Si intenta establecerlo en el valor más grande posible, es decir, 1 GB, que se vería así: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru
23

La consulta está limitada por max_allowed_packeten general.

Dmytro Lytovchenko
fuente
6

Puede insertar un número infinito de filas con una instrucción INSERT. Por ejemplo, podría ejecutar un procedimiento almacenado que tiene un bucle ejecutado mil veces, cada vez que ejecuta una consulta INSERT.

O su INSERT podría disparar un disparador que a su vez realiza un INSERT. Que dispara otro gatillo. Y así.

No, no depende del número de conjuntos de valores. Tampoco depende del número de bytes.

Existe un límite en cuanto a la profundidad de los paréntesis que pueden estar anidados y un límite a la extensión de la declaración total. Irónicamente, se hace referencia a ambos en thedailywtf.com. Sin embargo, los dos medios que mencioné anteriormente superan estos límites.

Borealido
fuente
Sus ejemplos son para ejecutar múltiples INSERT, y no muestra cómo insertar múltiples filas en una instrucción INSERT ..
Lukman
@Lukman: Una consulta INSERT puede resultar en que múltiples INSERTOS lleguen a la base de datos. Es solo una cuestión de quién cuenta qué.
Borealid
2
es cierto, pero su primer ejemplo muestra cómo ejecutar una consulta en un bucle con cada bucle ejecutando una instrucción INSERT, y no dice nada sobre esa instrucción INSERT que inserta varias filas. es solo una cuestión de énfasis.
Lukman
Nadie puede hacer nada infinito. Siempre hay límites de recursos.
Adrien
¿Esto se aplica también a la declaración SELECT ... FROM? Quiero decir, si los datos se han insertado en primer lugar con max_allowed_packet, ¿no debería seleccionarse esto también después de eso? No entiendo por qué se aplica a todas las demás declaraciones, como dijo el otro cartel cuando primero debe insertarse antes que cualquier otra cosa de todos modos.
Thielicious
2

Creo que no hay un número definido de filas que esté limitado a insertar por INSERT, pero puede haber algún tipo de tamaño máximo para las consultas en general.

DMags
fuente
2

Está limitado por max_allowed_packet.
Puede especificar utilizando: mysqld --max_allowed_packet=32M Por defecto es 16M.
También puede especificar en my.cnf en / etc / mysql /

linehrr
fuente