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?

Luistar15
fonte

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.

Lukman
fonte
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

Raju Akula
fonte
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
24

A consulta é limitada por max_allowed_packetem geral.

Dmytro Lytovchenko
fonte
9

referem-se a http://forums.mysql.com/read.php?20,161869 , que está relacionado com a configuração do mysql: max_allowed_packet, bulk_insert_buffer_size, key_buffer_size.

Clark yu
fonte
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.

Borealida
fonte
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.

DMags
fonte
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 /

linehrr
fonte