• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

[gato]

[Resolvido] Insert de uma query com centenas de linhas

7 mensagens neste tópico

Boa tarde pessoal

Já ando por aqui há algum tempo mas não costumo postar, se calhar porque me respondem às dúvidas antes de as fazer :P

Mas neste caso ainda tenho dúvidas :)

Ora bem, estou a desenvolver uma aplicação web (php) que numa das suas componentes pega num ficheiro .txt, faz o seu parsing e é suposto inserir numa base de dados (mysql) esses valores.

O problema é que esses ficheiros normalmente têm milhares de linhas, correspondendo cada linha a uma nova linha numa tabela da base de dados.

A minha pergunta é se posso fazer só um insert na base de dados com esses valores todos, do tipo:

insert into tabela values

( . . .),

( . . .),

( . . .),

( . . .);

tentei fazer isso mas quando faço a query dá-me o erro "server has gone away"

Por enquanto tenho um insert para cada linha, mas queria evitar isso ao máximo devido à performance.

Cumprimentos,

Nuno Gato

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi...

Experimenta esta query:

INSERT INTO tabela (campo1, campo2) VALUES
('lolz', 'lawl'),
('lulz', 'lowl')

Se não dá, não percebo porquê...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

dar dá, mas só se tiver algumas centenas de linhas.

se tiver milhares (como é o mais normal) já não dá e dá erro "MySQL server has gone away" é tipo timeout do server.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uhm. E porque não dividires em várias queries? Tipo, cada query aí com 500 rows.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

You can also get these errors if you send a query to the server that is incorrect or too large. If mysqld receives a packet that is too large or out of order, it assumes that something has gone wrong with the client and closes the connection. If you need big queries (for example, if you are working with big BLOB columns), you can increase the query limit by setting the server's max_allowed_packet variable, which has a default value of 1MB. You may also need to increase the maximum packet size on the client end. More information on setting the packet size is given in Section B.1.2.9, “Packet too large”.

An INSERT or REPLACE statement that inserts a great many rows can also cause these sorts of errors. Either one of these statements sends a single request to the server irrespective of the number of rows to be inserted; thus, you can often avoid the error by reducing the number of rows sent per INSERT or REPLACE.

É mesmo uma restrição do MySQL :P dizem para fazer insert's mais pequenos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uhm. E porque não dividires em várias queries? Tipo, cada query aí com 500 rows.

sim, vou ter de fazer isso

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então, podes modificar a configuração do servidor MySQL e aumentar o max_allowed_packet. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora