Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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?
E que tal algo como:
WHERE `id` > 5 AND `id` < 10
ou
WHERE `id` = 5 OR `id` = 6....
Já pensou em algum algoritmo que trabalhe no sentido de realizar um único ou pouquíssimos updates?
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!
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.
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?
Achei meio complicado esse jeito do hufersil.
Sim, os ids são sem quebra... é de 1 a 100mil
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!
guhfloripa,
Você pode colocar uma amostra dos updates que você precisa fazer?
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'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á.
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);
Se não tiver chave estrageira, use REPLACE.
Se tiver chave estrangeira, utilize INSERT ... ON DUPLICATE KEY UPDATE ....
@braços e fique com Deus!