MySQL - quantas linhas posso inserir em uma única instrução INSERT?


93

Depende do número de conjuntos de valores? Depende do número de bytes na instrução INSERT?

Respostas:


94

Você pode inserir um número infinitamente grande de registros usando o INSERT ... SELECTpadrão, desde que você tenha esses registros, ou parte deles, em outras tabelas.

Mas se você estiver codificando os valores usando o INSERT ... VALUESpadrão, então há um limite para o tamanho / tamanho de sua instrução: max_allowed_packet que limita o comprimento das instruções SQL enviadas pelo cliente para o servidor de banco de dados e afeta qualquer tipo de consulta e não apenas para a instrução INSERT.


47

Idealmente, o Mysql permite a criação de um número infinito de linhas em uma única inserção (de uma vez), mas quando um

O cliente MySQL ou o servidor mysqld recebe um pacote maior que max_allowed_packet bytes, ele emite um erro de pacote muito grande e fecha a conexão.

Para ver qual é o valor padrão da variável max_allowed_packet, execute o seguinte comando no MySQL:

show variables like 'max_allowed_packet';

A instalação padrão do MySQL tem um valor padrão de 1048576 bytes (1 MB). Isso pode ser aumentado definindo-o para um valor mais alto para uma sessão ou conexão.

Isso define o valor para 500 MB para todos (é isso que significa GLOBAL):

SET GLOBAL max_allowed_packet=524288000;

verifique sua mudança no novo terminal com nova conexão:

show variables like 'max_allowed_packet';

Agora ele deve funcionar sem nenhum erro para inserir registros infinitos. obrigado


12
500 MB não é infinito. É muito maior do que o valor padrão, mas ainda assim, não é infinito.
Carlos2W

1
Uma pergunta: para que exatamente é esse limite? A própria consulta? E sobre os dados, vincular ao executar a instrução? Posso estar seguro, até strlen($query_with_questionmarks) < $max_alloweed_packet?
pilat

Se você estivesse tentando configurá-lo para o maior valor possível, que é 1 GB, que ficaria assim: SET GLOBAL max_allowed_packet = 1073741824
PHP Guru




6

Você pode inserir um número infinito de linhas com uma instrução INSERT. Por exemplo, você pode executar um procedimento armazenado que tem um loop executado mil vezes, cada vez executando uma consulta INSERT.

Ou seu INSERT pode disparar um gatilho que executa um INSERT. O que aciona outro gatilho. E assim por diante.

Não, não depende do número de conjuntos de valores. Nem depende do número de bytes.

Há um limite para o quão profundamente aninhados seus parênteses podem ser e um limite para o tamanho de sua declaração total. Ambos são referenciados, ironicamente, em thedailywtf.com. No entanto, ambos os meios que mencionei acima contornam esses limites.


Seus exemplos são para executar vários INSERT e não mostra como inserir várias linhas em uma instrução INSERT.
Lukman

@Lukman: Uma consulta INSERT pode resultar em vários INSERTS atingindo o banco de dados. É só uma questão de quem está contando o quê.
Borealid de

2
verdade isso, mas seu primeiro exemplo mostra sobre a execução de consulta em um loop com cada loop executando uma instrução INSERT, e não diz nada sobre aquela instrução INSERT inserindo várias linhas. é apenas uma questão de ênfase.
Lukman

Ninguém pode fazer nada infinito. Sempre há limites de recursos.
Adrien

Isso se aplica à instrução SELECT ... FROM também? Quero dizer, se os dados foram inseridos em primeiro lugar com max_allowed_packet, não deveria ser possível selecionar depois disso também? Não entendo por que é aplicado a todas as outras afirmações, como o outro pôster disse quando teve que ser inserido antes de qualquer outra coisa.
Thielicious

2

Acredito que não haja um número definido de linhas que você está limitado a inserir por INSERT, mas pode haver algum tipo de tamanho máximo para consultas em geral.


2

É limitado por max_allowed_packet.
Você pode especificar usando: mysqld --max_allowed_packet=32M É 16M por padrão.
Você também pode especificar em my.cnf em / etc / mysql /

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.