Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
925 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  If (SELECT) then UPDATE ELSE INSERT ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

If (SELECT) then UPDATE ELSE INSERT ...

n°1411296
Olivier51
Posté le 22-07-2006 à 00:54:07  profilanswer
 

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:

mood
Publicité
Posté le 22-07-2006 à 00:54:07  profilanswer
 

n°1411323
Beegee
Posté le 22-07-2006 à 09:54:52  profilanswer
 

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'.

n°1411331
Sh@rdar
Ex-PhPéteur
Posté le 22-07-2006 à 10:26:31  profilanswer
 

ç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
n°1411367
Beegee
Posté le 22-07-2006 à 11:41:43  profilanswer
 

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

n°1411462
Olivier51
Posté le 22-07-2006 à 15:49:49  profilanswer
 

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

n°1411466
Sh@rdar
Ex-PhPéteur
Posté le 22-07-2006 à 16:11:36  profilanswer
 

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
n°1411469
Olivier51
Posté le 22-07-2006 à 16:15:26  profilanswer
 

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 ;)

n°1411470
Sh@rdar
Ex-PhPéteur
Posté le 22-07-2006 à 16:16:46  profilanswer
 

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
n°1411472
Olivier51
Posté le 22-07-2006 à 16:22:07  profilanswer
 

C'était qu'un exemple ;)

n°1411508
Beegee
Posté le 22-07-2006 à 18:24:03  profilanswer
 

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 ;)

mood
Publicité
Posté le 22-07-2006 à 18:24:03  profilanswer
 

n°1412179
orafrance
Posté le 24-07-2006 à 11:48:48  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  If (SELECT) then UPDATE ELSE INSERT ...

 

Sujets relatifs
comment stocker le resultat d'un "select" dans une variableduplicate entry for key sur une requete UPDATE
Probleme insert [PHP/SQL][C# .net] Faire un simple "select" à SQL Server
Javascript/DOM ajout input/select en colonne dans un tableau[résolu] Insert un peu compliqué
[.NET] DataTable ou DataAdapter et update/insert -goto en C# oo-recharger un select (menu déroulant) en php
probleme ON UPDATE CASCADE MYSQL 
Plus de sujets relatifs à : If (SELECT) then UPDATE ELSE INSERT ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR