Insert ou Update suivant Select

Eléphant du PHP | 97 Messages

20 nov. 2006, 00:17

Bonjour,

Peut simplement faire un insert ou un update dans une table suivant le résultat d'un select en une requete sans faire :

select ....
si exits => update ...
si non => insert ...

:?:

ViPHP
ViPHP | 1961 Messages

20 nov. 2006, 00:20

Bonsoir,

Tu n'as pas besoin de faire un 'SELECT' avant.
Tout simplement avec

Code : Tout sélectionner

INSERT INTO ... ON DUPLICATE KEY UPDATE ..
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 97 Messages

21 nov. 2006, 23:19

Merci.
ça marche impec.

Mais peut on faire plusieurs Update dans MySQL ?

On peut faire plusieurs UPDATE sur un même enregistrement grace à "UPDATE table SET chp1 = 'test', chp2 = 'azerty' WHERE chp_id = '3';"

Mais il semble que MySQL refuse l'envoi de plusieurs requetes d'un coup tel que "UPDATE table SET chp1 = 'test' WHERE chp_id = '3';UPDATE table SET chp1 = 'test2' WHERE chp_id = '4';"

Sommes nous obliger de faire un boucle qui passe UPDATE par UPDATE (ligne par ligne) ?

ViPHP
ViPHP | 1961 Messages

21 nov. 2006, 23:27

Bonsoir,

Ce n'est pas tout à fait vrai, sinon il (MySQL) ferait comment pour gérer les transactions ?
Un autre petit point, il ne faut JAMAIS mettre ';' dans tes requêtes PHP.
Tu ne sais pas à l'avance quel est le caractère séparateur de requêtes 'DELIMITER'
L'intérêt d'exécuter une requête à la fois c'est de récupérer un éventuel code d'erreur.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 97 Messages

22 nov. 2006, 10:52

on ne peut donc pas envoyer plusieurs requetes. :(

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

22 nov. 2006, 10:54

Plusieurs requêtes en même temps, non.

Plusieurs requetes à la suite, oui ;)

Mais lit bien ce que t'a dit Ajoloca, c'est plein de bon sens. Surtout la partie qui parle de la récupération des erreurs ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 97 Messages

24 nov. 2006, 14:55

Merci :?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 nov. 2006, 16:16

En fait on peut envoyer plusieurs requêtes à la fois avec mysqli_multi_query() ou utiliser de manière détournée des variantes de INSERT INTO ... ON DUPLICATE KEY UPDATE mais ce n'est pas vraiment plus performant en étant sérieusement plus compliqué à déboguer. Si tu as de nombreuses mises à jour (quelques centaines au plus) à effectuer, je recommande d'utiliser des requêtes préparées (voir mysqli_prepare()) sous MySQLi

Je ne sais pas si c'est une bonne idée de le suggérer, mais il existe une méthode qui peut être plus efficace dans certains cas (plusieurs centaines ou milliers d'UPDATE) c'est de remplacer les UPDATE par des INSERT. Deux façons de procéder : soit tu crées une table temporaire, tu fais un gros INSERT multi-enregistrement dedans puis tu fais un UPDATE multi-table. Soit, dans certains cas très spécifiques (dizaines de milliers d'UPDATE ?) tu crées une nouvelle table, un gros INSERT des nouvelles valeurs puis un INSERT IGNORE pour compléter avec les anciens enregistrements. Après ça, tu RENAME TABLE pour échanger le nom des tables et tu DROP TABLE la table originale. Je ne mentionne cette technique que pour la beauté du sport, ces techniques ne sont adaptées qu'à un très très faible nombre de cas.