Eviter les doublons dans une table ? [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 21-12-2003 à 18:49:08
tu mets un index unique sur le couple (nom,prenom) et tu trappes la violation de contrainte dans ton code
Marsh Posté le 21-12-2003 à 19:00:43
j'arrive a faire une clé unique pour ce couple mais que mettre dans la taille des champs ?? (car c'est du texte et ça peut prendre bcq)
Marsh Posté le 21-12-2003 à 19:06:50
oki merci bien
je comprends mieux l'histoire de la taille.
pour ce qui est de fouiner sur le net pour trouver la réponse, on s'y perd très vite pour trouver ce genre de réponse
alors qu'ici y'a tout plein de gens qui connaissent tout et qui répondent super rapidement
Marsh Posté le 21-12-2003 à 20:06:05
sinon tu peux faire cette verification en faisait 1 select et si mysql_num_rows(tarequete) retourne 0 tu peux inserer, sinon tu affiche "deja existant"
voila
Marsh Posté le 21-12-2003 à 20:23:56
c un peu con de le faire toi meme quand le sgbd le fait pour toi
Marsh Posté le 21-12-2003 à 20:24:28
Bab a écrit : oki merci bien |
et si tout le monde faisait pareil ?
Marsh Posté le 21-12-2003 à 20:28:05
HappyHarry a écrit : c un peu con de le faire toi meme quand le sgbd le fait pour toi |
oué mais dans le cas du sgbd, il ne te retourne pas le message "deja inséré"
Marsh Posté le 21-12-2003 à 20:30:38
vu le nombre de posts par jour, bcq font pareils
tu trouve pas que c'est pour ça ce forum ???
Marsh Posté le 21-12-2003 à 20:30:38
y'a qu'a faire un trigger sur l'insert ou l'update qui détectera et traitera le doublon
ah non, mince c'est mysql
Marsh Posté le 21-12-2003 à 20:32:28
Fabien a écrit : oué mais dans le cas du sgbd, il ne te retourne pas le message "deja inséré" |
ahem ... qu'est ce qui t'empeche de trapper l'erreur et d'afficher le message de ton choix ?
Marsh Posté le 21-12-2003 à 20:32:53
Harkonnen a écrit : y'a qu'a faire un trigger sur l'insert ou l'update qui détectera et traitera le doublon |
c ptet un poil bourrin comme solution, non ?
Marsh Posté le 21-12-2003 à 20:40:12
HappyHarry a écrit : |
un peu mais bon, au moins c'est efficace
Marsh Posté le 21-12-2003 à 20:41:06
ReplyMarsh Posté le 21-12-2003 à 20:44:16
HappyHarry a écrit : |
ben je sais pas faire.
t'as un exemple ?
tu veux dire un truc du genre or die("message" ) ?
Marsh Posté le 21-12-2003 à 20:47:42
chais pas j'connais pas php
apres avoir jeté un coup d'oeil dans la doc, ca quitte le script ca non ?
mon idée, et ca se fait tres bien dans d'autres languages, c d'intercepter l'erreur sans quitter, et afficher proprement un message d'erreur dans une zone de son choix
Marsh Posté le 21-12-2003 à 20:54:08
HappyHarry a écrit : chais pas j'connais pas php |
oué mais comment tu fait pour identifier l'erreur? ca peut etre un probleme dans la requete, comme un probleme de doublon, et tu veux faire comment pour differencier ?
Marsh Posté le 21-12-2003 à 20:56:49
y a un numero d'erreur en general qui est retourné, apres y a plus qu'a mater la doc du sgbd
edit : en php, a priori mysql_errno (et mysql_error pour avoir le texte associé)
Marsh Posté le 21-12-2003 à 21:02:50
Fabien a écrit : ben je sais pas faire. |
non
ce qu'il veut dire, c'est que tu dois trapper le code d'erreur, et afficher un message en conséquence
un exemple en VB .NET et Access (moi non plus je connais pas PHP) :
Code :
|
Bien sur, tu peux adapter le message en fonction du code d'erreur retourné par Ex.Errors(0). Dans mon cas, j'affiche juste le message d'erreur retourné par Access
Marsh Posté le 21-12-2003 à 21:55:27
Harkonnen a écrit :
|
ha oué, mais ca c'est crade et pas trés "user friendly".
t'image si je mettait "mysql error table doesn't exist" a la place de "cette catégorie n'existe pas".
Marsh Posté le 21-12-2003 à 22:07:59
Fabien > Tu dis n'importe quoi, Harko a pourtant bien expliqué..
Marsh Posté le 21-12-2003 à 22:19:06
*Syl* a écrit : Fabien > Tu dis n'importe quoi, Harko a pourtant bien expliqué.. |
bon ben je verais la doc mysql sur les erreurs pour voir, parce que l'exemple que m'as donné harko n'est pas en php/mysql donc ca m'aide pas trop si je veux faire comme cela.
Marsh Posté le 22-12-2003 à 10:07:02
Fabien a écrit : bon ben je verais la doc mysql sur les erreurs pour voir, parce que l'exemple que m'as donné harko n'est pas en php/mysql donc ca m'aide pas trop si je veux faire comme cela. |
y'a pas de gestion des exceptions en PHP, mais tu peux utiliser la fonction mysql_errno() pour afficher un message en fonction du code d'erreur.
liste des codes d'erreur (pas très explicite) :
http://www.mysql.com/doc/en/Error-returns.html
ou sinon tu peux aller récupérer directement les #define des différents codes d'erreur dans le source de mysql, tu as le code d'erreur, le #define correspondant, et le message associé
Marsh Posté le 22-12-2003 à 14:43:34
Pour un insert, laisser le SGBD vérifier les contraintes c'est bien, sauf pour des inserts multiples, comme pour des deletes multiples.
Exemple :
- L'appli : Tiens voilà une liste. Coches les cases devant les items à supprimer.
- L'utilisateur : J'ai coché 3 items : Machin, Truc et Bidule.
- L'appli. Ok, t'est bien certain de vouloir supprimer Machin, Truc et Bidule ?
- L'utilisateur : Oui !
- L'appli : Ha merde, impossible de supprimer Truc, il est utilisé par autre chose ! Heu, en revanche Machin et Bidule ont bien été supprimés ;-)
- L'utilisateur : Merde putain c'est quoi cette appli. Elle aurait pas pu me le dire avant. Si Truc n'était pas supprimable, j'aurai pas non plus supprimé Machin ! Merde de Merde, va falloir que je recrée Machin !
Je préfère une appli qui ne propose à la sélection que ce qui est réellement supprimable.
Bien sûr les choses peuvent avoir changées entre l'affichage de la liste et la validation de l'utilisateur.
Penser aussi à ne rien faire si tous les enregs demandé ne sont pas supprimables (transaction ou lock).
Dans ce cas, il faut re-demander confirmation à l'utilisateur puisque sa demande ne peut pas être honorée complètement.
Marsh Posté le 21-12-2003 à 18:47:43
est-ce qu'il est possible quand on insert des données dans une table d'éviter les doublons ?
exemple avec une table "truc" ayant un champ NOM et un champ PRENOM
on insert :
INSERT INTO truc (NOM,PRENOM) values("toto", "the" )
et je voudrais ke si je repète l'insertion, il ne se passe rien car les valeurs existent déjà
possible simplement ?