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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top