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
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
10 réponses
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
6 juil. 2020 à 09:37
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.
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.
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
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?
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
6 juil. 2020 à 10:27
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.
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.
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
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
7 juil. 2020 à 07:46
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.
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.
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.
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
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
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?
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?
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
7 juil. 2020 à 08:18
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.
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
7 juil. 2020 à 08:25
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.
et j'ai des centaines de cas comme cela dans des champs different.
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
6 juil. 2020 à 11:11
Merci beaucoup. Je vais essayer cela.
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
7 juil. 2020 à 09:19
C'est a dire un index unique? Il faut que je leur attribut le meme id?
jordane45
Messages postés
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
7 juil. 2020 à 10:00
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".
(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".
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
38314
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
7 juil. 2020 à 10:16
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 ?
Et du coup la requête se présentera comment ?
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
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
7 juil. 2020 à 11:41
après avoir créé l'index, remplace INSERT par REPLACE
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
8 juil. 2020 à 06:29
Merci ç'a fonctionne . Merci beaucoup à tous les deux.
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
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:
J'ai fait une table intermediaire ou je n'ai mis que les champs a modifier
Ici ma table a modifier:
ma requete:
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?
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?
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
Modifié le 9 juil. 2020 à 08:21
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.:
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
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
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?
Merci j'essai ce soir.Par contre il est ou l'update dans ta requete?
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
Modifié le 9 juil. 2020 à 13:14
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, ...
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
9 juil. 2020 à 13:17
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.
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
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
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).
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
Modifié le 9 juil. 2020 à 13:32
Modifié le 9 juil. 2020 à 13:32
Ok merci de ta patience et de tes explications c'a me permets de progresser.
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
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
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
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.
Je peux passé a l'UPDATE.
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
9 juil. 2020 à 23:25
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.
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
10 juil. 2020 à 00:03
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,
...
yg_be
Messages postés
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
1 554
>
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
10 juil. 2020 à 09:11
en effet, c'est ma suggestion pour l'UPDATE.
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
23350
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 novembre 2024
10 juil. 2020 à 09:29
10 juil. 2020 à 09:29
Ok merci. Je vais tester.
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
7 août 2020 à 14:17
Salut,
super çà marche merci.
super çà marche merci.