Update avec un fichier csv sur phpMyAdmin
Résolu
europe21
Messages postés
63
Date d'inscription
Statut
Membre
Dernière intervention
-
europe21 Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
europe21 Messages postés 63 Date d'inscription Statut Membre Dernière intervention -
10 réponses
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.
Merci de ta reponse. Tu aurais une donc ou un lien qui donne la marche a suivre pour la table intermédiaire?
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.
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.
C'est a dire un index unique? Il faut que je leur attribut le meme id?
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".
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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?
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
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?
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
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.