Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

guhfloripa

100mil updates uma única vez

Recommended Posts

Oi, estou precisando fazer 100 mil updates em minha tabela.

Estou com:

 

for($i=1;$i<100000;$i++){

UPDATE .... Where id=$i

}

 

Só que demora fazer 100000mil updates, teria alguma maneira de fazer tudo de uma unica vez?

Eu verifiquei que para insert existe uma tecnica, segue o link http://blog.thiagobelem.net/cadastrando-multiplos-registros-no-mysql-ao-mesmo-tempo/

 

Mas para update existe algum jeito? Sabendo que a clausula where vai alterar cada vez que passar no loop...

 

Alguem sabe?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não tiver chave estrageira, use REPLACE.

Se tiver chave estrangeira, utilize INSERT ... ON DUPLICATE KEY UPDATE ....

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma possibilidade seria criar strings mais longos, com 10, 100 ou 1000 updates, e submeter ao banco de dados em "lotes".

 

Já pensou nessa possibilidade?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matheus e Prog:

 

A sugestão que dei, funciona para Updates massivos, nos quais os valores a serem atualizados são diferentes para cada registro, exemplo:

 

UPDATE pessoa SET nome = 'hugo' WHERE codpessoa = 1;
UPDATE pessoa SET nome = 'mirian' WHERE codpessoa = 2;

 

Logo, isto não serviria:

UPDATE pessoa SET nome = 'hugo' WHERE codpessoa IN( 1,2 );

 

Com o que sugeri (com ON DUPLICATE KEY):

INSERT INTO pessoa (codpessoa, nome) 
VALUES (1, 'hugo'),(2,'mirian')
ON DUPLICATE KEY UPDATE nome = VALUES(nome);

 

A grande sacada do ON DUPLICATE KEY em relação ao REPLACE, é que o REPLACE, internamente, executa um DELETE. Este método citado agora não.

 

BEGIN EDIT

@Prog

 

Sim, a sua sugestão de fazer em lotes, é altamente recomendada, até mesmo porque em alguns servidores o buffer de entrada (tamanho do SQL) é limitado.

 

Se ele tentar atualizar os 100mil numa pancada só, pode dar problema.

Mas, atualizando em blocos de 500 ~ 1000, usando ainda o método que sugeri, as coisas ficam bem mais rápidas ;)

END EDIT

 

@braços e fiquem com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe, mas meu conhecimento sobre banco de dados não é muito vasto.

 

Eu irei update ids diferentes e com valores diferentes.

 

Exemplo:

 

UPDATE table_legendas SET name = 'sol' WHERE id = '1'

UPDATE table_legendas SET name = 'lua' WHERE id = '3'

UPDATE table_legendas SET name = 'mar' WHERE id = '232'

 

Qual a melhor maneira entre todas, para fazer apenas uma query fazendo os updates simultaneamente?

 

Poderia me mostrar como ficaria no exemplo acima? para facilitar o entendimento.

 

Desde já, meu muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

acredito que seja a forma que o hufersil passou com ON DUPLICATE KEY:

INSERT INTO pessoa (codpessoa, nome) 
VALUES (1, 'hugo'),(2,'mirian')
ON DUPLICATE KEY UPDATE nome = VALUES(nome);

 

Só uma dúvida, um banco com este tanto de registro está redondo mesmo (ID de 1 a 100mil), sem quebra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo contrário: é super simples.

Veja, é uma clausula INSERT, a qual você já deve estar acostumado.

Só acrescenta-se ao final a clausula ON DUPLICATE KEY UPDATE...

 

A melhor parte, é que você pode se aproveitar do multi-insert.

Exemplo:

 

INSERT simples, que você já conhece:

INSERT INTO pessoa (codpessoa, nome) VALUES (1, 'hugo');

 

INSERT com vários registros em uma chamada ("multi-insert"):

INSERT INTO pessoa(codpessoa, nome) VALUES (1, 'hugo'), (2, 'mirian'), (3, 'mara');

 

INSERT com vários registros em uma chamada, adicionando a atualização em caso de chaves iguais, (neste caso, vamos só mandar atualizar o nome):

INSERT INTO pessoa(codpessoa, nome) VALUES (1, 'hugo'), (2, 'mirian'), (3, 'mara')
ON DUPLICATE KEY UPDATE nome = VALUES(nome);

 

Viu como é simples?

Um INSERT básico, com apenas uma instrução a mais para atualização em caso de já existir um registro com a chave primária indicada :thumbsup:

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado hufersil, e se caso precisar UPDATE nome e idade juntos?

Como ficaria essa query com 2?

 

INSERT INTO pessoa(codpessoa, nome, idade) VALUES (1, 'hugo' , 24), (2, 'mirian' ,42), (3, 'mara' , 61)

ON DUPLICATE KEY UPDATE nome = VALUES(nome) AND idade= VALUES(idade);

 

Essa sintaxe está certa para update dois campos?

 

 

Moderador Prog,

O update que eu preciso fazer são dois campos em 100 mil registros, algo como:

UPDATE table_legendas SET name = 'sol', inglesnome='sun' WHERE id = '1'

UPDATE table_legendas SET name = 'lua', inglesnome='moon' WHERE id = '187'

Compartilhar este post


Link para o post
Compartilhar em outros sites

São SÓ esses dois campos em todos os registros? Ou são SÓ esses dois campos SÓ nesses dois registros

 

No primeiro caso, você remove o WHERE, assim o UPDATE será executado em todos os registro pois não há nada que limite a query.

 

No segundo, executa como está.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase isso, só troque o AND por virgula

INSERT INTO pessoa(codpessoa, nome, idade) VALUES (1, 'hugo' , 24), (2, 'mirian' ,42), (3, 'mara' , 61)
ON DUPLICATE KEY UPDATE nome = VALUES(nome), idade= VALUES(idade);

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.