Update avec un fichier csv sur phpMyAdmin

Résolu/Fermé
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 - 6 juil. 2020 à 09:26
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 - 7 août 2020 à 14:17
Bonjour a tous,

J'ai un fichier csv avec une liste d’adhérents que je doit pour certains inserer et pour d'autres mettre a jour dans ma table 'adherent'. Je passe par l'import de phpMyAdmin.

Le souci que j'ai c'est que c'a me fait des doublons au lieu de me mettre a jour.

Est ce qu'il existe une solution?

Merci d'avance pour vos réponses.


Configuration: Windows / Chrome 83.0.4103.116

10 réponses

jordane45 Messages postés 38268 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
6 juil. 2020 à 09:37
Bonjour,

Si tu utilises la fonction d'import de phpmyadmin pour charger ton CSV... non il n'y a pas de solution directement pour mettre à jour les lignes existantes.
La seule solution est de passer par une table intermédiaire puis de faire une requête qui ira mettre à jour la table finale.


0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
6 juil. 2020 à 09:58
Merci de ta reponse. Tu aurais une donc ou un lien qui donne la marche a suivre pour la table intermédiaire?
0
jordane45 Messages postés 38268 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
6 juil. 2020 à 10:27
Ben tu créés une nouvelle table dans ta bdd ( même structure que celle que tu veux mettre à jour )
Tu upload ton csv dedans
Puis tu fais une requête pour mettre à jour les lignes déjà présentes dans ta table initiale et insérer les nouvelles.
Si tu as défini une clé primaire unique commune aux deux tables, tu dois pouvoir utiliser un REPLACE au lieu de faire un INSERT.
Sinon, tu devras le faire en deux requêtes.
Une pour mettre à jour ( UPDATE) les lignes existantes et une en INSERT pour les "nouvelles" lignes.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > jordane45 Messages postés 38268 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024
7 juil. 2020 à 07:46
J'ai créé ma table intermediaire et j'ai uploadé mon csv. j'ai testé un INSERT et c'a marche.
INSERT INTO adherent (last_name, first_name, born,subcategory,tonumber,sexe,  complement,address, lieut,postal_code,city, record,licence_type, home_phone,mobile_phone, fax,email,  category_arbitre,place_of_birth,club_change, club_out
) SELECT last_name, first_name, born,subcategory,tonumber,sexe, complement,address, lieut,postal_code,city, record,licence_type, home_phone,mobile_phone, fax,email, category_arbitre,place_of_birth,club_change, club_out
FROM inter

Mais pour le UPDATE je bloque. Quand tu dis qu'il faut deux requetes . c'est deux requetes separés. Il faut que je trie manuellement les lignes qu'il faut mettre a jour de celles a simplement insérer ou ou on peux combiner les deux requetes et si oui comment?
Merci pour ta patience, j'avoue que je ne suis pas a l'aise avec le SQL.
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550 > europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
Modifié le 7 juil. 2020 à 08:17
j'imagine que l'INSERT ne te convient pas, car il crée des doublons. qu'en est-il?

le plus propre, c'est de commencer pas définir un index unique, qui "empêche" les doublons. comment définis-tu un doublon dans ton contexte?
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
7 juil. 2020 à 08:18
oui c'a crée des doublons. En fait j'ai une liste d'adherent en csv .certains adherents de cette liste existe deja dans la base de donnée ,il s'agit d'une mise a jour et certains sont des nouveaux adherents.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
7 juil. 2020 à 08:25
he bien en fait j'ai par exemple dans ma base de donnée jean dupont qui est dans la categorie u9 . Dans mon csv j'ai jean dupont qui est passé en u20. Au lieu de me modifier se champ il me crée un autre jean dupont.
et j'ai des centaines de cas comme cela dans des champs different.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
6 juil. 2020 à 11:11
Merci beaucoup. Je vais essayer cela.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
7 juil. 2020 à 09:19
C'est a dire un index unique? Il faut que je leur attribut le meme id?
0
jordane45 Messages postés 38268 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
7 juil. 2020 à 10:00
Tu peux créer un INDEX qui serait composé de tes champs last_name et first_name par exemple.
(en espérant que tu n'aies pas d'homonymes... )
Ou mieux, le champ email ( en considérant que cette donnée ne changera jamais )
Bref, il faut que tu trouves quelque chose qui te permette de savoir si c'est une nouvelle ligne à ajouter dans la bdd ... ou si c'est une à mettre à jour.
Ce côté "métier" .. il n'y a que toi qui soit en mesure de le "concevoir".
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > jordane45 Messages postés 38268 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024
7 juil. 2020 à 10:16
Oui je vais prendre le numéro de licence car il est unique.
Et du coup la requête se présentera comment ?
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550 > europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
7 juil. 2020 à 11:41
après avoir créé l'index, remplace INSERT par REPLACE
0

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

Posez votre question
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
8 juil. 2020 à 06:29
Merci ç'a fonctionne . Merci beaucoup à tous les deux.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
9 juil. 2020 à 07:02
Re-bonjour ,
C'a fonctionne en local car j'ai testé sur une table qui n'avait pas de contrainte par contre sur le site en production il me met se message:
MySQL a répondu : Documentation

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`sero1050_uspeg`.`commande`, CONSTRAINT `FK_6EEAA67D25F06C53` FOREIGN KEY (`adherent_id`) REFERENCES `adherent` (`id`))


J'ai fait une table intermediaire ou je n'ai mis que les champs a modifier


Ici ma table a modifier:


ma requete:
REPLACE INTO adherent (last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out
) SELECT last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out
FROM inter


Je pensais que c'a n'allait modifier que les champs indiqué, pourquoi il me parle des clé etrangère. Qu'est ce que je peux faire?
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550
Modifié le 9 juil. 2020 à 08:21
le REPLACE fait, quand la clé est présente, un DELETE puis un INSERT.
c'est le DELETE qui provoque le message d'erreur concernant la clé étrangère.
je pense donc qu'il va falloir faire un INSERT et un UPDATE.
l'INSERT serait ainsi, en supposant que le numéro de licence soit dans le champ to_number.:
INSERT INTO adherent 
(last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out) 
SELECT last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out
FROM inter LEFT JOIN adherent ON inter.to_number = adherent.to_number
WHERE adherent.to_number IS NULL
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
Modifié le 9 juil. 2020 à 10:02
Oui il est dans le to_number.
Merci j'essai ce soir.Par contre il est ou l'update dans ta requete?
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550
Modifié le 9 juil. 2020 à 13:14
l'UPDATE n'y est pas encore, ce sera une seconde requête, voyons d'abord si l'INSERT fonctionne.

UPDATE adherent as a
INNER JOIN inter as i ON i.to_number = a.to_number
SET
a.last_name=i.last_name,
a.first_name=i.first_name,
...
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
9 juil. 2020 à 13:17
Ok j'essaie ce soir. Donc si je comprends bien avec cette requête je vais insérer les nouveaux adhérents qui sont dans ma table .Et rien ne se passera pour les adhérents identiques des deux tables. C'a ne fait qu'inserer les nouveaux.
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550 > europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
9 juil. 2020 à 13:23
tu as bien compris. tu peux d'ailleurs vérifier en testant le SELECT inclus dans l'INSERT (du mot SELECT jusqu'à la fin de la requête).
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
Modifié le 9 juil. 2020 à 13:32
Ok merci de ta patience et de tes explications c'a me permets de progresser.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
9 juil. 2020 à 22:00
J'ai une erreur:
Erreur
Requête SQL : Documentation


INSERT INTO adherent
(last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out)
SELECT last_name, first_name, born,sub_category,to_number,sex,complement,address, lieut,postal_code,city, record,home_phone,mobile_phone,email,place_of_birth,club_change, club_out
FROM inter LEFT JOIN adherent ON inter.to_number = adherent.to_number
WHERE adherent.to_number IS NULL
MySQL a répondu : Documentation

#1052 - Champ: 'last_name' dans field list est ambigu
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
9 juil. 2020 à 22:15
C'est bon c'a marche j'ai rajouté la table inter au champ et c'a a fonctionné.
Je peux passé a l'UPDATE.
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550
9 juil. 2020 à 23:25
en effet, quand les mêmes noms de champs sont présents dans les deux tables faisant partie du FROM, il faut préciser de quelle table vient chacun de ces champs. et, dans ce cas, ils viennent bien de la table inter.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
10 juil. 2020 à 00:03
Pour l'update je fais la requête que tu m'as donné ?
  UPDATE adherent as a
INNER JOIN inter as i ON i.to_number = a.to_number
SET
a.last_name=i.last_name,
a.first_name=i.first_name,
...
0
yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024 1 550 > europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
10 juil. 2020 à 09:11
en effet, c'est ma suggestion pour l'UPDATE.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024 > yg_be Messages postés 23309 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 2 novembre 2024
10 juil. 2020 à 09:29
Ok merci. Je vais tester.
0
europe21 Messages postés 63 Date d'inscription mardi 26 décembre 2017 Statut Membre Dernière intervention 4 février 2024
7 août 2020 à 14:17
Salut,
super çà marche merci.
0