If (SELECT) then UPDATE ELSE INSERT ...

If (SELECT) then UPDATE ELSE INSERT ... - SQL/NoSQL - Programmation

Marsh Posté le 22-07-2006 à 00:54:07    

J'aimerais savoir si il n'y a pas plus simple que ça, le faire en une requete MySQL (c'est du PHP + MySQL) ...
 
Je fais ma requete SELECT pour connaitre N le nombre d'entrée dans ma table correspondent à ma condition C
Si (N == 0) Alors  
    je fais un INSERT correspndant à ma condition
Sinon
    je fais un UPDATE je mais à jour l'entrée correspondant à ma condition
Fin Si
 
Note 1: Le REPLACE aurait pu etre pas mal, mais j'ai besoin d'une primary key ... ma table n'en a pas (elle relie deux autres tables)
Note 2: Exemple
TABLE enfant (Name: string, Age:integer)
 
mysql> SELECT * FROM enfant WHERE Name='xyz';
php> N=nb d'entrée renvoyé par le SELECT
php> if (N = 0) then
mysql>    INSERT INTO enfant (Name,Age) VALUES('xyz',10)
php> else
mysql>    UPDATE enfant SET Age=10 WHERE Name='xyz';
php> end if
 
Note 3: Je verais bien un truc comme ça (si je ne peux pas le faire en une requete) :
(UPDATE enfant SET Age=10 WHERE Name='xyz') OR (INSERT INTO enfant (Name,Age) VALUES('xyz',10))
Mais si l'enfant 'xyz' a déjà 10ans, il ne va rien modifier et va alors créer un clone de l'enfant ....  :ouch:

Reply

Marsh Posté le 22-07-2006 à 00:54:07   

Reply

Marsh Posté le 22-07-2006 à 09:54:52    

Regarde si cela te convient :
 
http://www.estvideo.com/dew/index/ [...] key-update
 
Sous Oracle par exemple, on a MERGE qui permet de faire des UPDATE / INSERT en fonction de conditions ... mais mySql n'a apparemment que le 'ON DUPLICATE KEY' (qui nécessite donc un index).
 
Ta table, même si elle 'relie' deux autres tables, devrait avoir une clé unique : les 2 champs clé des table 'reliées'.

Reply

Marsh Posté le 22-07-2006 à 10:26:31    

ça pourrait le faire avec un INSERT REPLACE, mais faudrait définir le Name comme clef primaire :/


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 22-07-2006 à 11:41:43    

Sinon faut rester à 2 requêtes :
 
mysql> UPDATE enfant SET Age=10 WHERE Name='xyz';
php> N=nb d'enregistrements mis à jour
php> if (N = 0) then  
mysql>    INSERT INTO enfant (Name,Age) VALUES('xyz',10)  
php> end if

Reply

Marsh Posté le 22-07-2006 à 15:49:49    

Beegee > je l'avais vu dans la doc de mysql, mais le problème, c'est que je ne peux pas avoir de clée primaire (enfin si;), mais on va prendre le cas ou je n'en ai pas)
 
Mon exemple était pas super pour le montrer, je le refais :
TABLE trip (FirstName: string, LastName: string, VisitedCountry: string, Times: integer)
TABLE child (FirstName:string,LastName:string,Age:interger)
TABLE country (Name:string,Capital:string)
 
mysql> SELECT * FROM trip WHERE FirstName='xyz' AND LastName='DuponT' AND VisitedCountry='UK';
php> N=nb d'entrée renvoyé par le SELECT
php> if (N = 0) then
mysql>    INSERT INTO trip (FirstName,LastName,VisitedCountry,Times) VALUES('xyz','DuponT','UK',1)
php> else
mysql>    UPDATE trip SET Times=Times+1 WHERE FirstName='xyz' AND LastName='DuponT' AND VisitedCountry='UK';
php> end if
 
Dans ce cas là, je n'ai pas de clé primaire, donc pas de MERGE ou duplicate key possible

Reply

Marsh Posté le 22-07-2006 à 16:11:36    

suffit d'ajouter une clef primaire [:spamafote]


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 22-07-2006 à 16:15:26    

Ouaip, je viens de découvrir le PRIMARY KEY(col1,col2) ... je pensais qu'on ne pouvais le faire que sur une colonne ...
 
Désolé pour le dérangement, merci pour la découverte ;)

Reply

Marsh Posté le 22-07-2006 à 16:16:46    

ajoute une clef numérique :o
 
tu vas faire comment avec les homonymes sinon pour les différencier ?


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 22-07-2006 à 16:22:07    

C'était qu'un exemple ;)

Reply

Marsh Posté le 22-07-2006 à 18:24:03    

Olivier51 a écrit :

Ouaip, je viens de découvrir le PRIMARY KEY(col1,col2) ... je pensais qu'on ne pouvais le faire que sur une colonne ...
 
Désolé pour le dérangement, merci pour la découverte ;)


 
J'en parlais déjà ce matin ;)

Reply

Marsh Posté le 22-07-2006 à 18:24:03   

Reply

Marsh Posté le 24-07-2006 à 11:48:48    

il y a MERGE sous Oracle... ça n'existe pas dans MySQL ?

Reply

Sujets relatifs:

Leave a Replay

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