Commande SQL qui ne modifie qu'une seule ligne...

Commande SQL qui ne modifie qu'une seule ligne... - SQL/NoSQL - Programmation

Marsh Posté le 29-02-2012 à 08:12:17    

Bonjour à tous !
 
Quelqu'un a-t-il une idée et peut me dire pourquoi cette p#@§%@ de commande Sql ne me modifie qu'une seule et unique valeur :  
 

Code :
  1. UPDATE `mabase`.`matable` SET `monchamp` = 'valeur'
  2. WHERE CONVERT( `monautrechamp` USING utf8 ) = 'valeur'


 
Je veux en fait copier la valeur du champ "monautrechamp" dans le champ "monchamp"
 
Le problème est que ça marche et ça me modifie qu'une seule valeur, si je change la valeur, la valeur est à nouveau modifiée mais une seule fois !!!
Ca fait 2 heures que je suis dessus et je comprends plus.
Je précise que les valeurs sont des mots... est-ce que c'est important avec utf8 ?
 
Je précise aussi que j'utilise cette commande via la console Sql de phpmyadmin
Sinon si vous avez un avis...    
Merci

Reply

Marsh Posté le 29-02-2012 à 08:12:17   

Reply

Marsh Posté le 29-02-2012 à 11:42:35    

Le where est une close de restriction.
Pour le confirmer, au lieu d'un update, faire un select :

Select `mabase`.`matable`
WHERE CONVERT( `monautrechamp` USING utf8 ) = 'valeur'

Combien de lignes seront renvoyées par ce select ? Une seule, je pense. Donc, après, il est normal que Update ne mette à jour qu'une ligne.
 
Il faudrait tenter une autre requête :

UPDATE `mabase`.`matable`  
   SET `monchamp` = CONVERT( `monautrechamp` USING utf8 )

Reply

Marsh Posté le 29-02-2012 à 12:10:37    

merci  
En fait non le where peut renvoyer beaucoup de lignes.
 
Je vais tenter l'autre commande avec un limit qd même  :)

Reply

Marsh Posté le 29-02-2012 à 13:35:05    

Bon ça me renvoie une erreur :  
 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CONVERT( `monautrechamp` USING utf8 ) = 'valeur' LIMIT 1' at line 2
 
avec cette requête...

Code :
  1. UPDATE `mabase`.`matable` SET `monchamp` = 'Valeur'
  2. CONVERT( `monautrechamp` USING utf8 ) = 'Valeur' LIMIT 1


 [:abnocte invictus]

Reply

Marsh Posté le 29-02-2012 à 14:22:08    

Limit n'est pas utilisable dans un update normalement...
+ pour ce qu'a dit olivthill. Je ne vois pas d'autre explication.
 
T'es sûr que quand tu fais un :

Code :
  1. select * from matable where CONVERT( `monautrechamp` USING utf8 ) = 'valeur'


y'a bien plusieurs valeurs qui sont remontées?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-02-2012 à 14:29:10    

rufo a écrit :

Limit n'est pas utilisable dans un update normalement...
+ pour ce qu'a dit olivthill. Je ne vois pas d'autre explication.
 
T'es sûr que quand tu fais un :

Code :
  1. select * from matable where CONVERT( `monautrechamp` USING utf8 ) = 'valeur'


y'a bien plusieurs valeurs qui sont remontées?


 
Oui ta commande renvoie "Affichage des enregistrements 0 - 29 (527 total, traitement: 0.0024 sec.)"
 
Sinon pour le limit je le fais tout le temps donc à mon avis ce n'est pas en cause, enfin j'en sais rien...

Reply

Marsh Posté le 29-02-2012 à 15:10:21    

Après vérif dans la doc, effectivement update accepte un limit à la fin. J'aurai appris un truc aujourd'hui :)
 
A noter tout de même que le limit marche uniquement si le update est fait sur une seule table. Si c'est sur du multi-tables, on peut faire que du where (on perd le order by et le limit). C'est très subtil... :/
 
http://dev.mysql.com/doc/refman/5.0/fr/update.html


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-02-2012 à 15:20:43    

Bon ben ça m'ennuie, ce qui m'inquiète c'est que même mon hébergeur ne sait pas...
Pitin y a un truc là c'est sûr !!!

Reply

Marsh Posté le 29-02-2012 à 15:29:12    

Franchement je comprends pas trop l'intérêt de la requête a part pourrir les perfs...
 
Utilise une bind variable pour ta valeur, gère bien la connexion au SGBD pour déclarer le charset que tu va utiliser lors de ta connexion (i.e. que ça soit le même que celui utilisé par ton programme) et envoi ta valeur telle quelle...
 
Parce que convertir une colonne à la volée... mais WTF... :heink:


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 29-02-2012 à 15:34:13    

Attention
 

dexenium a écrit :

... j'utilise cette commande via la console Sql de phpmyadmin


 
c'est un truc que je vais faire 1 ou 2 fois dans l'année (c'est pas intégré dans un script php ou autre), en même temps j'ai 8000 fiches à modifier...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed