Ajouter des enregistrements en évitant les doublons

Résolu/Fermé
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 - Modifié par coxycross le 22/02/2013 à 16:38
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 - 22 févr. 2013 à 17:38
Bonjour,

J'ai besoin d'un coup de main en MySQL, j'ai une base de données, dans laquelle j'ai des personnes d'enregistrées, et elles ont chacune un numero unique.
J'ai un fichier .csv que je lis puis j'ajoute le contenu dans ma BDD, cependant, dans ce fichier, j'ai des personnes qui sont déjà présentes dans ma base, donc elles ne doivent pas être ajoutées.

Sauf que je ne sais pas, avec une requête MySQL, éviter les doublons.

En gros, dans mon fichier csv j'ai le nom - prenom - numero pour chaque personne.
Dans ma base de données j'ai la meme chose, mais si le numero de la personne (et seulement le numero) est déjà présent dans ma base de donées, la personne n'est pas ajoutée.

Je ne sais pas comment faire cela, j'essaye avec un truc de ce genre là :
RAjoutMasse = "INSERT INTO eleves(Nom,Prenom,Classe,NumCarte) VALUES ('" + Nom[i] + "','" + Prenom[i] + "','" + Classe[i] + "', '" + NumCarte[i] + "')WHERE NOT EXISTS (SELECT * FROM 'table'  WHERE value1='stuff for value1' AND value2='stuff for value2')";


Tout ce qui est en gras est la partie que je ne sais pas rédiger, je ne comprends pas comment marche de NOT EXIST. Peut etre existe-t-il une autre méthode ?

Cordialement

Coxycross
A voir également:

8 réponses

Utilisateur anonyme
22 févr. 2013 à 16:38
Met un index UNIQUE sur un champ de ta base et fait un INSERT IGNORE
1
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 16:40
Salut, et merci de ta réponse. Je ne suis pas très familier avec le MySQL, et les BDD en général d'ailleurs. Comment marche cet index UNIQUE ?
0
Utilisateur anonyme
22 févr. 2013 à 16:46
Tu utilises quoi pour gérer ta base de données phpmyadmin?
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 16:49
Oui phpmyadmin en effet. J'ai donc, je pense, trouvé pour mettre en UNIQUE, c'est au meme endroit, ou l'on définit la clef primaire, unique, ou Index ?
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 16:53
Sachant que ce numero ne doit pas etre la clef primaire, puisque ma clef primaire est un ID
0
Utilisateur anonyme
22 févr. 2013 à 16:54
Exactement tu édite la structure de la table, le champ unique interdit l'insertion d'un nouvel enregistrement si ce champ existe déjà dans la table.
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 16:55
Je viens de cliquer sur UNIQUE depuis phpmyadmin, mais rien ne me confirme que ce numero devient donc unique, il y a un moyen pour le voir ? un moyen visuel pour voir que ce numero est bien desormais UNIQUE ?
0
Utilisateur anonyme
22 févr. 2013 à 16:57
Le plus simple essaies de faire un insert avec un numéro déjà existant et regarde ce qu'il se passe!
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 16:58
Je suis en ce moment meme en train de tester cela.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:02
Donc, pour le moment ça ne fonctionne pas, j'ai mis mon champ NumCarte en UNIQUE, et j'utilise la requete ci dessous pour remplir ma BDD. Sauf que j'ai encore des doublons :

RPassageAnnee = "INSERT INTO eleves(Nom,Prenom,Classe,NumCarte) VALUES ('" + Nom[i] + "','" + Prenom[i] + "','" + Classe[i] + "', '" + NumCarte[i] + "')";
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:05
Le truc, c'est que si, le champ NumCarte existe déjà dans ma base de données, alors la personne n'est pas ajoutée. Son nom, prenom, classe, et numcarte, ne sont pas enregistré dans ma bdd puisqu'ils existent déjà. Mais je n'arrive pas à ce résultat, le moindre coup de main est le bienvenue.
0
Hum bizarre bizarre, parce que lorsque je met un champ unique (pour mon exemple idcompteur) sur une table et que j'essaie de faire un insert d'une valeur déjà existante :
 INSERT INTO 'bddaccess'.'testunique' (   
'idcompteur' ,   
'champ1' ,   
'champ2'   
)   
VALUES (   
'1', '1', '1'   
)


Mysql me répond :
Erreur #1062 - Duplicate entry '1' for key 'idcompteur'
=> pas d'insert


Lorsque tu as cliqué sur UNIQUE dans la structure de la table, mysql ne t'as pas renvoyé d'erreur?

De base tu avais des doublons dans ta table?
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:17
Lorsque je clique sur UNIQUE dans la structure de ma table, voila très exactement ce qu'il se passe
https://www.casimages.com/i/130222051747391985.jpg.html

Aucune erreur, ou quoi que ce soit. Mais je peux tout de meme avoir des doublons de NumCarte
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:19
Je ne sais pas si cela peut avoir une incidence, mais j'execute ma requete de cette manière :

MySqlCommand cmdPassageAnnee = new MySqlCommand(RPassageAnnee, conn);
                    cmdPassageAnnee.ExecuteNonQuery();
0
Regarde bien au-dessus de ta requête il y a écrit :
#1062 - Duplicata du champ '0' pour la clef "NumCarte"
donc le alter table n'est pas pris en compte, il faut d'abord supprimer les doublons présent dans la table , et ensuite cliqué sur unique pour effectuer le alter table
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:23
Ah oui effet, je n'avais pas bien regardé. En effet, dans ma BDD, NumCarte prend la valeur 0 quand il n'est pas renseigné. Je dois donc le metre en 'Null' ? est-ce que c'est possible ?
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:26
Ah voila, j'ai supprimé tous mes enregistrements, et je viens de réussir à la passer en UNIQUE. Je vais donc tester tout de suite, si je peux créer des doublons ou non
0
Utilisateur anonyme
22 févr. 2013 à 17:31
Il est possible de mettre le champ à NULL mais il faut aussi le préciser dans la structure il me semble
0
coxycross Messages postés 788 Date d'inscription mardi 3 novembre 2009 Statut Membre Dernière intervention 12 février 2015 110
22 févr. 2013 à 17:38
Ah! Merci beaucoup, maintenant tout marche comme je le souhaite.

Merci beaucoup de ton aide, tu viens de mettre fin à 2h de reflexion !
0