[MySQL] Eviter les doublons dans une table ?

Eviter les doublons dans une table ? [MySQL] - SQL/NoSQL - Programmation

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 ?

Reply

Marsh Posté le 21-12-2003 à 18:47:43   

Reply

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

Reply

Marsh Posté le 21-12-2003 à 18:57:30    

je vois pas comment faire un index unique sur ce couple

Reply

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)

Reply

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  :love:

Reply

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


Message édité par fabien le 21-12-2003 à 20:06:11
Reply

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 :o

Reply

Marsh Posté le 21-12-2003 à 20:24:28    

Bab a écrit :

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  :love:  


 
et si tout le monde faisait pareil ? :sarcastic:

Reply

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 :o

oué mais dans le cas du sgbd, il ne te retourne pas le message "deja inséré" :o

Reply

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 ???

Reply

Marsh Posté le 21-12-2003 à 20:30:38   

Reply

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
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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é" :o
 


 
ahem ... qu'est ce qui t'empeche de trapper l'erreur et d'afficher le message de ton choix ? :sarcastic:

Reply

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
 
ah non, mince c'est mysql
[:neowen]


 
c ptet un poil bourrin comme solution, non ?

Reply

Marsh Posté le 21-12-2003 à 20:40:12    

HappyHarry a écrit :


 
c ptet un poil bourrin comme solution, non ?  


un peu mais bon, au moins c'est efficace [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-12-2003 à 20:41:06    

Harkonnen a écrit :


un peu mais bon, au moins c'est efficace [:ddr555]


 
nan, meme pas ... c ca le pire [:ddr555]

Reply

Marsh Posté le 21-12-2003 à 20:44:16    

HappyHarry a écrit :


 
ahem ... qu'est ce qui t'empeche de trapper l'erreur et d'afficher le message de ton choix ? :sarcastic:

ben je sais pas faire.
t'as un exemple ?
 
tu veux dire un truc du genre or die("message" ) ?

Reply

Marsh Posté le 21-12-2003 à 20:47:42    

chais pas j'connais pas php [:spamafote]
 
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

Reply

Marsh Posté le 21-12-2003 à 20:54:08    

HappyHarry a écrit :

chais pas j'connais pas php [:spamafote]
 
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
 

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 ?

Reply

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


Message édité par HappyHarry le 21-12-2003 à 20:59:43
Reply

Marsh Posté le 21-12-2003 à 21:02:50    

Fabien a écrit :

ben je sais pas faire.
t'as un exemple ?
 
tu veux dire un truc du genre or die("message" ) ?


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 :
  1. Try
  2.    While Reader.Read
  3.       req = "DELETE * FROM Table Where Champ = xxx"
  4.       comm.CommandText = req
  5.       comm.ExecuteNonQuery()
  6.    End While
  7. Catch Ex as OleDb.OleDbException
  8.    MessageBox.Show(Ex.Errors(0).Message)
  9. End Try


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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-12-2003 à 21:55:27    

Harkonnen a écrit :


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 :
  1. Try
  2.    While Reader.Read
  3.       req = "DELETE * FROM Table Where Champ = xxx"
  4.       comm.CommandText = req
  5.       comm.ExecuteNonQuery()
  6.    End While
  7. Catch Ex as OleDb.OleDbException
  8.    MessageBox.Show(Ex.Errors(0).Message)
  9. End Try


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

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

Reply

Marsh Posté le 21-12-2003 à 22:07:59    

Fabien > Tu dis n'importe quoi, Harko a pourtant bien expliqué..

Reply

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.

Reply

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é

Reply

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.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed