Update avec un fichier csv sur phpMyAdmin [Résolu]

Signaler
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
-
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
-
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

Messages postés
30125
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 novembre 2020
2 962
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.


Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

Merci de ta reponse. Tu aurais une donc ou un lien qui donne la marche a suivre pour la table intermédiaire?
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
30125
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 novembre 2020

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.
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727 >
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

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?
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

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.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

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.
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727 >
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

il faut donc créer un index unique qui empêche d'avoir deux enregistrements tels que "jean dupont".
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

Merci beaucoup. Je vais essayer cela.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

C'est a dire un index unique? Il faut que je leur attribut le meme id?
Messages postés
30125
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 novembre 2020
2 962
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".
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
30125
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
13 novembre 2020

Oui je vais prendre le numéro de licence car il est unique.
Et du coup la requête se présentera comment ?
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727 >
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

après avoir créé l'index, remplace INSERT par REPLACE
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

Merci ç'a fonctionne . Merci beaucoup à tous les deux.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

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?
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

Oui il est dans le to_number.
Merci j'essai ce soir.Par contre il est ou l'update dans ta requete?
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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,
...
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

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.
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727 >
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

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).
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

Ok merci de ta patience et de tes explications c'a me permets de progresser.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

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
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

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.
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727
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.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

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,
...
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020
727 >
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

en effet, c'est ma suggestion pour l'UPDATE.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020
>
Messages postés
13061
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
13 novembre 2020

Ok merci. Je vais tester.
Messages postés
60
Date d'inscription
mardi 26 décembre 2017
Statut
Membre
Dernière intervention
24 août 2020

Salut,
super çà marche merci.