Existe-t-il un moyen rapide de mettre à jour de nombreux enregistrements en SQL?
-
08-07-2019 - |
Question
Je dois remplacer plus de 20 000 noms par les nouveaux noms que j'ai créés en fonction du CodeID.
Par exemple: je dois mettre à jour toutes les lignes contenant "chien". (qui a un code ID de 1) avec "chat", et met à jour toutes les lignes contenant "cheval". (qui a un code ID de 2) avec "oiseau", etc.
1ère instruction SQL: UPDATE animalTable SET cDescription
= "cat" WHERE CodeID
= 1
2ème instruction SQL: UPDATE animalTable SET cDescription
= "oiseau" WHERE CodeID
= 2
Ces instructions fonctionnent, mais j’ai besoin d’un moyen plus rapide, car j’ai plus de 20 000 noms.
Merci d'avance.
La solution
C’est le moyen le plus rapide de le faire.
Ou voulez-vous mettre à jour tous les enregistrements en une seule commande?
vous pouvez faire une mise à jour avec une jointure (Syntaxe fixe ... Havent l'a utilisée depuis un moment)
UPDATE animalTable
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID
SET animalTable.cDescription = CodeTable.Description_1;
Une autre option consiste à scinder les mises à jour en lots plus petits, cela réduira le temps de verrouillage de la table ... Mais la durée totale des mises à jour prendra plus de temps (il s’agit simplement d’une amélioration des performances précisées). Vous pouvez le faire en: mettre à jour uniquement certaines plages d'ID dans chaque lot.
De plus, vous pourriez avoir ces données dans un tableau séparé. Puisque les données ne sont pas normalisées. Éloignez-le pour qu'il soit plus normalisé.
Autres conseils
Vous pouvez créer une table temporaire contenant les valeurs de traduction et effectuer la mise à jour en fonction de celle-ci.
Par exemple:
create table #TRANSLATIONS
(
from varchar(32),
to varchar(32)
)
Ensuite, insérez les valeurs de traduction:
insert into #TRANSLATIONS (from,to) values ('cat','dog')
Enfin, mettez à jour en fonction de cela:
update MYTABLE
set myvalue = t.to
where myvalue = t.from
from MYTABLE m,
#TRANSLATIONS t
(Non testé, par coeur).
Vous pouvez utiliser une instruction CASE pour la mettre à jour
.METTRE À JOUR la table des animaux SET cDescription = CASE codeID WHEN 1 THEN 'cat' WHEN 2 THEN 'oiseau' .... FIN
Supposons que vous avez un fichier comme celui-ci:
1,cat
2,bird
...
Je voudrais écrire un script qui lit ce fichier et exécute une mise à jour pour chaque ligne.
En 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);
Pour accélérer le processus, vous ne devez mettre à jour que les enregistrements pour lesquels la valeur que vous souhaitez attribuer n'est pas déjà définie.
UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"
Cette approche permet à la commande de ne mettre à jour que les enregistrements qui ne sont pas encore "cat".
Avertissement: je déteste les chats.