Existe uma maneira rápida para atualizar muitos registros em SQL?
-
08-07-2019 - |
Pergunta
Eu preciso substituir mais de 20 000 nomes com novos nomes que eu criei dada a CodeID.
Por exemplo: Eu preciso atualizar todas as linhas que contêm "dog" (que tem um CodeID de 1) com o "gato", e atualizar todas as linhas que contêm "cavalo" (que tem um CodeID de 2) com o "pássaro" , etc.
1º instrução SQL: UPDATE animalTable SET cDescription
= "gato" ONDE CodeID
= 1
2 instrução SQL: UPDATE animalTable SET cDescription
= "pássaro" ONDE CodeID
= 2
Estas declarações trabalhar, mas eu preciso de uma maneira mais rápida de fazer isso, porque eu tenho mais de 20 000 nomes.
Agradecemos antecipadamente.
Solução
Isso é o modo mais rápido você pode fazê-lo.
Ou você quer atualizar todos os registros em um único comando?
Você pode fazer uma atualização com uma junção (Fixed Sintaxe ... Não reembolsaram utilizado este em um tempo)
UPDATE animalTable
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID
SET animalTable.cDescription = CodeTable.Description_1;
Outra opção é dividir as atualizações em lotes menores, isso irá reduzir o tempo a tabela está bloqueada ... Mas o tempo total das atualizações vai demorar mais tempo (Seu apenas uma melhoria de desempenho precieved) Você pode fazer isso, atualizar apenas determinados intervalos de identificação em cada lote.
Além disso, você poderia ter esses dados em uma tabela separada. Uma vez que os dados não são normalizados. Afastá-lo assim que sua mais normalizada.
Outras dicas
Você pode querer criar uma tabela temporária que contém os valores de tradução e atualização com base nisso.
Por exemplo:
create table #TRANSLATIONS
(
from varchar(32),
to varchar(32)
)
Em seguida, insira os valores de conversão:
insert into #TRANSLATIONS (from,to) values ('cat','dog')
Finalmente, atualização com base em que:
update MYTABLE
set myvalue = t.to
where myvalue = t.from
from MYTABLE m,
#TRANSLATIONS t
(não testado, em cima da minha cabeça).
Você pode usar uma declaração CASE para atualizá-lo
Atualização animaltable SET cDescription = CASE codeID QUANDO 1 ENTÃO 'gato' QUANDO 2 THEN 'pássaro' .... END
Supposind você tem um arquivo como este:
1,cat
2,bird
...
eu iria escrever um script que lê esse arquivo e executa uma atualização para cada linha.
Em PHP:
$f = fopen("file.csv","r")
while($row = fgetcsv($f, 1024)) {
$sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0];
mysql_query($sql);
}
fclose($f);
O que você poderia fazer para acelerá-lo é atualizar apenas os registros que ainda não têm o valor que você deseja atribuir.
UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"
Essa abordagem faz com que o comando só atualizar os registros que já não são 'gato'.
Disclaimer:. Eu odeio gatos