If (SELECT) then UPDATE ELSE INSERT ... - SQL/NoSQL - Programmation
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'.
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
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
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
Marsh Posté le 22-07-2006 à 16:11:36
suffit d'ajouter une clef primaire
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
Marsh Posté le 22-07-2006 à 16:16:46
ajoute une clef numérique
tu vas faire comment avec les homonymes sinon pour les différencier ?
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 ... |
J'en parlais déjà ce matin
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 ....