2010-01-04 5 views
4

Je dois mettre à jour tous les enregistrements d'une table (ne doit pas dépasser 100 enregistrements). Chaque enregistrement devra avoir un champ mis à jour avec une valeur différente. Est-ce que je vais devoir faire une requête pour chaque mise à jour ou y a-t-il un autre moyen? Je ne peux pas sembler comprendre à le faire à la foisMySQL: Y at-il un moyen de mettre à jour une table entière dans une requête?

Merci pour l'aide!

EDIT: Pour clarifier, chaque champ que je mets à jour contiendra une valeur unique qui est déterminée du côté client. Donc, aucune autre table n'est impliquée.

+1

Peut-être besoin de plus d'informations sur celui-ci. Est-ce que vous augmentez le champ, comme changer de 3 à 4? Toutes les lignes reçoivent-elles la même "nouvelle" valeur? Avez-vous un jeu de données qui inclut les nouvelles valeurs et les clés primaires correspondantes (ou autre champ)? – sberry

Répondre

6

La réponse dépend beaucoup de la source des nouvelles valeurs.

Si vous avez une courte liste de nouvelles valeurs, vous pourrez peut-être utiliser CASE:

UPDATE Table1 
SET column1 = CASE column1 
       WHEN 123 THEN ? 
       WHEN 456 THEN ? 
       ELSE ? 
       END; 

Ce n'est pas pratique si la liste des nouvelles valeurs est très longue.

Si vous avez besoin de mettre à jour vos lignes avec des valeurs qui existent dans les lignes corrélées d'une autre table, vous pouvez utiliser plusieurs tables de syntaxe UPDATE MySQL:

UPDATE Table1 JOIN Table2 ON (Table1.pk = Table2.fk) 
SET Table1.column1 = Table2.column2; 

Vous pouvez également faire quelque chose de similaire avec une sous-requête corrélée.

UPDATE Table1 SET column1 = (SELECT column2 FROM Table2 WHERE Table2.fk = Table1.pk); 

Il y a longtemps quand je 3,23 MySQL (avant il a soutenu la mise à jour multi-table ou sous-requêtes), je courrais un SELECT dont la sortie a été entièrement formé UPDATE. Il était difficile d'obtenir toutes les citations correctes, mais le résultat était un script SQL de centaines d'instructions UPDATE individuelles, chacune changeant les valeurs dans une rangée. Pas très efficace, mais si cela ne doit être fait que rarement, c'était bien.

SELECT CONCAT(
    'UPDATE Table1 SET column1 = ', QUOTE(Table2.column2), 
    ' WHERE pk = ', Table2.fk, ';') AS SQL_statement 
FROM Table2; 
+0

Merci de votre aide! J'ai essayé votre requête de mise à jour mais je n'arrive pas à le faire fonctionner. Je reçois cette erreur: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser près de 'CASE' à la ligne 1 MISE À JOUR Tableau1 SET colonne1 = CASE colonne2 QUAND 123 ALORS 7 QUAND 456 PUIS 56 ELSE 0 END CASE; – user239237

+0

Désolé, j'ai oublié la syntaxe de MySQL pour la fin de l'expression de cas est simplement 'FIN' alors que dans d'autres SGBDR ils préfèrent' END CASE'. J'ai modifié l'exemple ci-dessus. –

0

Sans connaître la valeur que vous attribuez à chaque ligne, la réponse est "probablement non". Une autre affiche a mentionné que vous pouvez affecter toutes les lignes à la fois en laissant la clause WHERE, mais cela ne vous aide pas si chaque ligne a besoin de sa propre valeur.

Si vous pouvez fournir quelques informations sur la façon dont vous savez quelle valeur donner à chaque ligne, il peut y avoir une meilleure réponse. En attente de plus d'informations ...

0

Si la valeur de la mise à jour diffère d'un enregistrement à l'autre, vous devrez créer une nouvelle instruction UPDATE à chaque fois.

+0

Ce n'est pas entièrement vrai. Si les données que vous souhaitez mettre à jour existent dans une autre table, vous pouvez utiliser une instruction de mise à jour. –

+0

oh n'a pas pensé à ça – antpaw

0

Si la nouvelle valeur de chaque ligne peut être déduite de la valeur actuelle de la ligne, vous pouvez le faire dans une seule requête UPDATE. Sinon, non.

Une façon consiste à stocker les colonnes souvent modifiées dans une table séparée, DELETE ou TRUNCATE cette table, et INSERT toutes les nouvelles valeurs dans une requête (en utilisant un insert à rangées multiples requêtes).

En MySQL, vous avez accès à ON DUPLICATE KEY UPDATE pour améliorer la première méthode.

0

Si chaque valeur est dérivée d'autres valeurs de la ligne et peut être calculée dans une simple expression, vous pouvez faire quelque chose comme ceci:

UPDATE table_name SET col1 = (col2/col3); 

Mais si vos nouvelles valeurs sont calculées en dehors de la base de données (par exemple, par un script), vous ne pouvez probablement pas faire mieux que séparer les requêtes de mise à jour pour chaque ligne.

0

Si chaque champ nécessite une valeur différente, non.

Vous pouvez avoir les valeurs dans un tableau et écrire une boucle qui le fait, vous n'avez donc pas besoin d'écrire manuellement chaque UPDATE.

$myIds = array('1', '2', '3'); 
$myField = array('something', 'something2', 'something3'); 

for($i=0; $i<count($myIds); $i++){ 
    mysql_query("UPDATE table SET field = '{$myField[$i]}' WHERE id = '{$myIds[$i]}'); 
} 

Vous pouvez même créer les myIds de $ et MyField $ tableaux par SELECT, en fonction de vos besoins, ce qui rendrait assez indolore.

S'il s'agit d'une entrée utilisateur, assurez-vous de nettoyer ces variables.

Questions connexes