JeuWeb - Crée ton jeu par navigateur
On duplicate key sur deux colonnes :s - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : On duplicate key sur deux colonnes :s (/showthread.php?tid=3835)

Pages : 1 2


On duplicate key sur deux colonnes :s - Siko - 26-03-2009

Voila actuellement j'utilise un principe pas tellement optimiser pour faire une requête Confused

En gros afin d'ajouter mes unités dans ma table, je vérifie dans un premiers temps si il existe déjà une unités de ce type sur la case.

Si il y a une unité j'update la ligne correspondante a l'unité.
Si il n'y a pas d'unités je la crée..

Sauf que pour cela, je fait d'abord un select count.. alors que je suppose qu'on peut faire ça directement dans mon insert avec des on duplicate key.

Malheureusement, je n'arrive pas a le faire car il faudrait vérifier trois colonnes en même temps et je n'arrive pas a le faire Confused

Donc pour résumer ma situation je vous proposes une requête qu'il devrait faire ce que je veux mais qui ne marche pas ^^

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY a AND b AND c UPDATE a=c+1 ;

Donc en gros si il existe une méthodes pour vérifier si il existe une ligne qui a en commun trois colonnes.

Merci d'avance ^^


RE: On duplicate key sur deux colonnes :s - madri2 - 26-03-2009

tiens je conaissait pas le on duplicate key !


RE: On duplicate key sur deux colonnes :s - wild-D - 27-03-2009

RTFM ^^

juste comme ça par curiosité; t'as pas pas cherché l'erreur bien loin non ?
par exemple aller voir dans le manuel de référence si t'as au moins construit ta requête correctement ça aurait été trop fatiguant ?
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

enfin lis la doc en particulier la condition (prend la version française si l'english te rebute).
à partir de là t'auras peut-être l'envie de chercher comment faire une clé unique ou primaire multiple; plutôt qu'inventer n'importe quoi parce que t'es trop malin pour prendre le temps de lire le manuel pour apprendre comment faut le faire.


RE: On duplicate key sur deux colonnes :s - Ruz - 28-03-2009

+1
tellement visible...
allez,je t'aide... google... premier exemple qui sort:

Code :
INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

Si t'as tjs pas capté... vérifie ta table (la key)...


RE: On duplicate key sur deux colonnes :s - Siko - 30-03-2009

Non non mais je crois que vous avez pas capter la... je sais que ma requête est fausse... mais elle illustrait ce que je voullait faire..

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

c'est cool ruz mais c'est tellement évident que logiquement quand on ne lit pas en entier les post on ne post pas de réponse..
ta requête dans mon cas ne me sert strictement a rien et même sans google ca doit faire 1 ans que je sait la faire celle-ci.

Sinon merci wild-D je n'avait pas trouver ce passage de la doc vu que je cherchait en français :] Mais je suis pas sur que ca réponde pleinement a mes exigences Wink


RE: On duplicate key sur deux colonnes :s - Holy - 30-03-2009

On duplicate key comme son nom l'indique se base sur les clés primaires allouées à la table. Si tu veux vérifier sur trois champs, rien de plus simples, tu balances trois clés primaires sur tes trois colonnes ^^

Exemple:
Type|Joueur|Etat

Tu fous trois clés primaires de manière à ce qu'il ne puisse exister qu'une seule ligne reprenant les mêmes infos et puis tu fais ta requête, ça marchera tout seul. C'est extrêmement pratique et peu gourmand en ressources Smile


RE: On duplicate key sur deux colonnes :s - Siko - 31-03-2009

Le problèmes c'est que si je fait ca : si une seules des colonnes a un doublon ça va me faire chier non ?

Ce que je cherche a faire c'est un "on duplicate key update" prenant comme clause where plusieurs arguments relier avec des AND alors que de base mysql met de base des OR..


RE: On duplicate key sur deux colonnes :s - Ruz - 31-03-2009

(31-03-2009, 09:03 PM)Siko a écrit : Le problèmes c'est que si je fait ca : si une seules des colonnes a un doublon ça va me faire chier non ?

Ce que je cherche a faire c'est un "on duplicate key update" prenant comme clause where plusieurs arguments relier avec des AND alors que de base mysql met de base des OR..

C'est justement l'intérêt d'une clé primaire...
1 clé primaire sur trois champs: chaque combinaison des trois champs est unique. (la clé primaire est unique sur une table)
Si tu veux un doublon des 3 champs, c'est qu'il te faut un 4e champ à ta clé... faut donc repenser ton modèle.

C'est un truc de base, ca...
Le "ON DUPLICATE KEY" est une solution de facilité: tu insères un enregistrement.. pas de bol, la combinaison existe déjà : on met un ou plusieurs champs à jour (de préférence pas ceux intervenant dans la clé, j'espère meme que c'est impossible (=> tu changerais la clé))

Je reprends un exemple bidon, pas le tien, c'est fait volontairement ^^
Citation :INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Tu vois un "WHERE" où, toi???

Et entre nous, j'ai l'impression que mysql travaille avec des AND ici... exemple:
champs:
ID_perso
ID_objet
Quantité

Clé primaire: (ID_objet et ID_perso)

Soit les enregistrements:
1 / 15 / 18
1 / 16 / 1
1 / 21 / 2
2 / 4 / 1

tu fais tes requetes:

INSERT INTO table (...) values (1 / 17 / 1) ON DUPLICATE KEY UPDATE Quantite = Quantite +1
=> 1 / 17 / 1 inséré

INSERT INTO table (...) values (1 / 15 / 2) ON DUPLICATE KEY UPDATE Quantite = Quantite +2
=> clé existe déjà => mise à jour (1 /15 /20)

1) Tu le veux où, ton where??? (meme dans la doc, j'en vois pas) ET dans quel but?
2) ce serait des "OR", tous les champs du perso 1 ET tous les champs des objets 15 seraient mis à jour... raté
3) Quand on t'aide, lis les messages aussi... si ca fait un an que tu sais le faire, ben, où est le problème? Tu recopies ou tu comprends ce que tu fais?
Enfin, m'attendant à la réponse type dans ce genre de discussion, je coupe court : Donnes un exemple concret de ce que tu veux faire (tables, enregistrements, requetes (idéalement selon toi) et résultats attendus). Je suis sûr que quelqu'un de plus compétent que moi arrivera à t'aider (je pense que mes idées te conviennent pas vu ta première réponse...)

Bon courage pour la suite


RE: On duplicate key sur deux colonnes :s - Siko - 01-04-2009

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

En fait mysql interprete comme ca ta requete

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1 WHERE a=1 or b=2;

Si bien sur a et b sont des champs uniques


RE: On duplicate key sur deux colonnes :s - Ruz - 02-04-2009

si a et b sont les composantes de la clé primaire de la table où tu insères.
sinon, oui, ca je suis d'accord pour l'interprétation ^^