Page 1 sur 1

ON DUPLICATE KEY UPDATE (problème de clée unique)

Posté : 03 juin 2009, 11:28
par enibib
Bonjour,

Le titre n'étant pas très parlant je vais essayer d'expliquer clairement mon pb .

J'ai une table avec deux champs id_candidat et type .
J'enregistre pour chaque candidat plusieurs types ...

J'aimerais avoir la possibilité lors de mon enregistrement que si un type est déjà enregistré je fasse un UPDATE. J'ai pensé à mettre mon champs type en clé unique et utiliser une requête

Code : Tout sélectionner

INSERT INTO Table( id_candidat, type) VALUES( '$id_candidat', '1') ON DUPLICATE KEY UPDATE id_candidat ='$id_candidat',type='1'";
or dans ma table je peux avoir plusieurs types de même valeur pour différents candidats .Vous me suivez ?

Donc je voudrais savoir comment faire pour ne pas à avoir faire plusieurs requêtes pour vérifier si un enregistrement existe déjà puis faire un UPDATE.

Posté : 03 juin 2009, 12:06
par AB
Tu crée une clef unique ou primaire composée des deux champs id_candidat et type, et le tour est joué.
Par contre l'utilisation de ON DUPLICATE KEY UPDATE recommande de n'avoir qu'une clé unique ou primaire pour la table. Il faudrait supprimer les autres clés de ce type si tu en as d'autres.

Posté : 03 juin 2009, 13:29
par enibib
J'ai bien pensait au champs unique que tu propose mais le problème ce que mon champs type prend des valeurs de 1 à 13 donc cela ne peut pas marcher :

type 11 candidat 1 : champs unique : 111
type 1 candidat : 11 champs unique : 111

:(

Posté : 03 juin 2009, 13:55
par AB
Ah bah je t'ai pas dit de créer un nouveau champ, je t'ai dit de créer une clé composée des deux champs, c'est à dire par exemple :

Code : Tout sélectionner

CREATE TABLE `test_enibib` ( `candidat` int(11) NOT NULL, `type` tinyint(4) NOT NULL, PRIMARY KEY (`candidat`,`type`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Contenu de la table `test_enibib` -- INSERT INTO `test_enibib` (`candidat`, `type`) VALUES (1, 11), (11, 1);

Posté : 03 juin 2009, 14:04
par enibib
Je ne savais pas qu'on pouvait mettre deux champs en clé primaire merci du conseil ... c'est ce que je chercher à faire en pensant que cela n'était pas possible.

PS : j'ai une autre clé primaire appelé 'id' et en auto increment ... Ça va poser problème ?
Sinon je peux la passer en clé unique .

Posté : 03 juin 2009, 14:52
par AB
Je ne savais pas qu'on pouvait mettre deux champs en clé primaire merci du conseil ... c'est ce que je chercher à faire en pensant que cela n'était pas possible.

PS : j'ai une autre clé primaire appelé 'id' et en auto increment ... Ça va poser problème ?
Sinon je peux la passer en clé unique .
Ben normalement il ne va plus te servir à rien cet 'id'. Tu en vois l'utilité ?

Posté : 03 juin 2009, 17:08
par enibib
Si je m'en sert quand même pour mettre en relation une autre table .
Mais en clé unique ça me vas très bien ^^